我发现 Java 中的 String.replaceAll() 具有正则表达式底层。它在短字符串中工作得很好。 但如果是长字符串,我需要一个更有效的算法而不是 String.replaceAll()。 有人可以给建议吗? 谢谢!
最佳答案
如果您想进行增量替换,可以对 StringBuffer
使用显式的 appendReplacement/Tail
循环(不幸的是,没有 StringBuilder
重载为还没有)。
这是成语from the documentation :
Pattern p = Pattern.compile(PATTERN);
Matcher m = p.matcher(INPUT_SOURCE);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, REPLACEMENT);
}
m.appendTail(sb);
System.out.println(sb.toString());
这几乎就是 replaceAll
的实现方式。
此方法的好处是,由于您可以完全控制替换迭代,因此您不必在任何给定时间将整个输出作为可能很长的字符串
存储在内存中。您可以逐步构建输出,定期将 StringBuffer
内容刷新到磁盘。也就是说,使用此方法比使用 replaceAll
具有更高的内存效率。
(您还可以进行当前替换语法不支持的奇特替换,例如 toUpperCase()
转换)。
请注意,需要增强 Matcher
以便能够附加到任何 Appendable
。如果获得许可,您不仅可以使用 StringBuilder
,还可以直接替换为例如一个FileWriter
.
相关问题
- in matcher.replace method,how to limit replace times?
- 有有限替换和案例转换的示例
-
StringBuilder
andStringBuffer
in Java
另请参阅
- BugID 5066679:
Matcher
should make more use ofAppendable
- 如果获得批准,此增强请求将允许
Matcher
附加到任何Appendable
- 如果获得批准,此增强请求将允许
关于java - 需要一个有效的算法来实现 String.replaceAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3522355/