3

"(?<!^)(?=[A-Z])"大文字に応じてトリングで分割する方法を理解するのに3時間ほど費やしました。

string[] s = Regex.Split("TheWorldWithoutStrangers", "(?<!^)(?=[A-Z])");

それはどのように機能しますか!! 上記の式の各文字の意味は理解できますが、どのように連携するのかわかりません。なぜ"(? < !^)([A-Z])"機能しないのですか?これは、改行の後にない大文字を見つけた場合はいつでも分割することを意味します。私は正しいですか?


repaint() で画像がちらつく

以前の質問の解決策を見つけたので、新しい問題が発生しました。

次のコードでは、矢印キーを使用して JFrame 内で画像を移動しています。しかし、矢印キーを押すたびに画像がちらつくように見えます。これは、キーを連続して押すと非常に目立ちます。

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class TestProgram extends JFrame implements KeyListener {
    private BufferedImage TestImage;
    private int cordX = 100;
    private int cordY = 100;

    public TestProgram() {
        setTitle("Testing....");
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }

    public void imageLoader() {
        try {
            String testPath = "test.png";
            TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));

        } catch (IOException ex) {
            ex.printStackTrace();
        }

        addKeyListener(this);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(TestImage, cordX, cordY, this);
    }

    public static void main(String[] args) {
        new TestProgram();
    }


    public void keyPressed(KeyEvent ke) {
        switch (ke.getKeyCode()) {
            case KeyEvent.VK_RIGHT: {
                cordX+=5;
            }
            break;
            case KeyEvent.VK_LEFT: {
                cordX-=5;
            }
            break;
            case KeyEvent.VK_DOWN: {
                cordY+=5;
            }
            break;
            case KeyEvent.VK_UP: {
                cordY-=3;
            }
            break;
        }
        repaint();
    }

    public void keyTyped(KeyEvent ke) {}

    public void keyReleased(KeyEvent ke) {}
}

それを回避する解決策はありますか?

編集: 上記は完全な作業コードです。doublebuffer を組み込むのは難しいと思います。誰かがその部分で私を助けることができますか?

4

2 に答える 2

4

the^は行の先頭を意味し(?<!...)、否定的な後ろ読みであるため(?<!^)、行の先頭以外の文字列内の任意の位置に一致します。

このセット[A-Z]は任意の大文字に一致し、正の(?=...)先読みであるため(?=[A-Z])、大文字の直前にある文字列内の任意の位置に一致します。

それらをまとめると、式は文字列内の行頭以外の任意の位置と一致し、大文字の直前になります。

于 2012-06-03T10:38:29.477 に答える
2

ここで重要なのは、 と の 2 つの部分(?<!...)(?=...)ゼロ幅のアサーションであることです。最初のものは^(文字列の開始) が一致位置の直前に発生しないことを確認し、2 つ目は[A-Z](単一の大文字) が一致位置の直後に表示されることを確認します。どちらのアサーションも実際にはどの文字とも一致しないため、実際の一致は空です。式全体が位置に一致するだけです。

于 2012-06-03T10:44:59.007 に答える