匹配找到无限循环

时间:2013-01-10 12:36:51

标签: java string pattern-matching match

我正在尝试替换长字符串中的某些单词。会发生什么,有些词保持不变,有些词也有所改变。不改变的单词似乎让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>";
}

有关为何可能发生这种情况的任何建议?

5 个答案:

答案 0 :(得分:3)

您在循环中重新初始化匹配器。

删除matcher = pattern.matcher(temp);循环中的while指令,不应该再被卡住了。

答案 1 :(得分: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");

否&#34;而&#34;循环,这是不必要的。匹配器不会替换它不匹配的文本,它将在同一个地方不匹配两次等方面做正确的工作 - 无需舀取它。

更重要的是,你的正则表达式可以在没有捕获的情况下完成。如果你只想取代&#34;单词&#34; (正则表达式没有单词的概念),在要匹配的文本周围添加单词锚点:

Pattern pattern = Pattern.compile("\\btext\\b");

答案 2 :(得分:0)

您希望匹配“文字”字词并再次将该字词替换为“text”(如果在changeWord()中的条件)或“new text”(否则在changeWord()中)。那就是它造成了无限循环。

答案 3 :(得分:0)

你为什么要使用Matcher?您不需要正则表达式来替换单词,只需使用replace()

input.replace("oldtext", "newtext"); // replace all occurrences of old with new 

答案 4 :(得分:0)

我只是通过添加以下行来修复它:

if (!match.equals(changeWords(match))) {
     matcher = pattern.matcher(temp);
}