【发布时间】:2018-03-01 04:18:38
【问题描述】:
我是 Java 新手,我在现有代码中发现了一个循环,它看起来应该是一个无限循环(或者具有非常不受欢迎的行为),它实际上可以工作。
你能解释一下我错过了什么吗?我认为它应该是无限的原因是,根据此处的文档 (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#replaceAll-java.lang.String-),调用 replaceAll 将重置匹配器(此方法首先重置此匹配器。然后扫描输入序列...... em>)。所以我认为下面的代码会替换它,然后再次调用 find(),这将从头开始。而且它会一直找到相同的字符串,因为你可以看到字符串只是被包裹在一个标签中。
如果不明显,Pattern 和 Matcher 是 java.util.regex 中的类。
String aTagName = getSomeTagName()
String text = getSomeText()
Pattern pattern = getSomePattern()
Matcher matches = pattern.matcher(text);
while (matches.find()) {
text = matches.replaceAll(String.format("<%1$s> %2$s </%1$s>", aTagName, matches.group()));
}
为什么不是这样?
【问题讨论】:
-
努佩。因为你要替换火柴,所以它不会再存在了……我想……我不知道。已经很晚了,我很累,因此不合理。让我召唤 Uni。
-
同样好奇的是,甚至不需要 while 循环,因为 replaceAll 将一次性完成工作并重置匹配项。我认为一个简单的 if 在这种情况下可以正常工作。如果是这样的话,我不知道你为什么需要检查matches.find,一个简单的replace all应该可以工作。