0

ドキュメントで見つけた各パターンのインデックスを取得しようとしています。これまでのところ:

    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher matcher = pattern.matcher(temp);
    int current = 0;
    int start;
    int end;

    while (matcher.find()) {
        start = matcher.start(current);
        end = matcher.end(current);
        System.out.println(temp.substring(start, end));
        current++;
    }

何らかの理由で、 inの最初のインスタンスのみを検索し続けますがHelloWorldtemp、その結果、無限ループが発生します。正直なところ、使用できるかどうかはわかりませんでした。以前は機能していたのでmatcher.start(current)matcher.end(current)それは単なる推測でした。matcher.group(current)今回は実際のインデックスが必要ですが、うまくいきmatcher.group()ません。

4

6 に答える 6

2

正規表現を次のように変更します。

while (matcher.find()) {
    start = matcher.start();
    end = matcher.end();
    System.out.println(temp.substring(start, end));
}
于 2013-01-10T08:25:52.340 に答える
2

start(int)とにインデックスを渡さないでくださいend(int)。APIは、パラメーターがグループ番号であると述べています。あなたの場合、ゼロだけが正しいです。代わりにstart()とを使用してください。end()

マッチャーは、次の呼び出しにより、反復ごとに次のマッチに移動しますfind()

このメソッドは、入力シーケンスの先頭から開始します。メソッドの前回の呼び出しが成功し、マッチャーがリセットされていない場合は、前回の一致と一致しなかった最初の文字から開始します。

于 2013-01-10T08:34:03.630 に答える
1

問題はこのコード行です。

 start = matcher.start(current);

current最初の反復後は1です。

于 2013-01-10T08:34:02.357 に答える
1

一致したテキストの開始オフセットと終了オフセットだけが必要な場合は、現在のグループは必要ありません。これで問題ありません。

    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher matcher = pattern.matcher(temp);
    int current = 0;

    while (matcher.find()) {
        System.out.println(temp.substring(matcher.start(), matcher.end()));
    }
于 2013-01-10T08:34:20.203 に答える
1
while (matcher.find()) {
    start = matcher.start();
    end = matcher.end();
    System.out.println(temp.substring(start, end));
}

あなたがやりたいことをします。

于 2013-01-10T08:38:39.173 に答える
0
    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher m = pattern.matcher(temp);
    while (matcher.find()) {
        System.out.println(temp.substring(m.start(), m.stop()));
    }
于 2020-08-18T03:37:13.067 に答える