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”循环,这是不必要的。匹配器不会替换它不匹配的文本,并且它会在同一个地方不匹配两次等方面做正确的工作——不需要用勺子喂它。

更重要的是,您的正则表达式可以在没有捕获括号的情况下完成。如果您只想替换“单词”(正则表达式没有单词的概念),请在要匹配的文本周围添加单词锚点:

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 回答