1

長い文字列内の特定の単語を置き換えようとしています。何が起こるかというと、同じままの単語と変化する単語があります。変更されない単語は、同じままであるはずの単語に対してmatcher同じアクションを実行しようとし続けるため、無限ループに陥っているように見えます。以下は私のものと似た例です - 私が使用している正確なコードを配置することはできませんでした.

public String test() {
    String temp = "<p><img src=\"logo.jpg\"/></p>\n<p>CANT TOUCH THIS!</p>";
    Pattern pattern = Pattern.compile("(<p(\\s.+)?>(.+)?</p>)");
    Matcher matcher = pattern.matcher(temp);
    StringBuilder stringBuilder = new StringBuilder(temp);
    int start;
    int end;
    String match;

    while (matcher.find()) {
        start = matcher.start();
        end = matcher.end();
        match = temp.substring(start, end);
        stringBuilder.replace(start, end, changeWords(match));
        temp = stringBuilder.toString();
        matcher = pattern.matcher(temp);
        System.out.println("This is the word I'm getting stuck on: " + match);
    }
    return temp;
}

public String changeWords(String words) {
    return "<p><img src=\"logo.jpg\"/></p>";
}

なぜこれが起こっているのかについての提案はありますか?

4

5 に答える 5

3

ループ内でマッチャーを再初期化します。

matcher = pattern.matcher(temp); ループ内の命令を削除するwhileと、もうスタックすることはありません。

于 2013-01-10T12:42:15.393 に答える
1

使い方がMatcher間違っています。while ループは次のようになります。

while (matcher.find()) {
     start = matcher.start();
     end = matcher.end();
     match = temp.substring(start, end);
     stringBuilder.replace(start, end, changeWords(match));
     temp = stringBuilder.toString();
     matcher = pattern.matcher(temp);
}

それはちょうどあるべきです:

matcher.replaceAll(temp, "new text");

「while」ループはありません。不要です。マッチャー、一致しないテキストを置き換えず、同じ場所で 2 回一致しないなどの点で適切に機能します。スプーンフィードする必要はありません。

さらに、正規表現はキャプチャ括弧なしで実行できます。また、「単語」のみを置き換えたい場合 (正規表現には単語の概念がありません)、一致するテキストの周りに単語アンカーを追加します。

Pattern pattern = Pattern.compile("\\btext\\b");
于 2013-01-10T12:40:43.510 に答える
0

そもそもなんで使っMatcherてんの?単語を置き換えるために正規表現は必要ありません。次を使用してreplace()ください。

input.replace("oldtext", "newtext"); // replace all occurrences of old with new 
于 2013-01-10T12:50:47.623 に答える
0

次の行を追加するだけで修正しました:

if (!match.equals(changeWords(match))) {
     matcher = pattern.matcher(temp);
}
于 2013-01-11T09:41:30.053 に答える
0

「テキスト」単語に一致するものを探しており、その単語を「テキスト」(changeWord() の条件の場合) または「新しいテキスト」(changeWord() の場合) に置き換えます。それが無限ループを引き起こしている理由です。

于 2013-01-10T12:40:32.603 に答える