我正在尝试替换长字符串中的某些单词。会发生什么,有些词保持不变,有些词也有所改变。不改变的单词似乎让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>";
}
有关为何可能发生这种情况的任何建议?
答案 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);
}