java - 需要一个有效的算法来实现 String.replaceAll()

标签 java string

我发现 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 .

相关问题

另请参阅

关于java - 需要一个有效的算法来实现 String.replaceAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3522355/

相关文章:

java - 为什么抛出异常的方法的调用者在这种情况下不必处理异常?

java - 在 Java 中跟踪时间

java - 计算两个 UML 模型之间的差异

java - 访问另一个类中的方法

c++ - 如何在 C++ 中使用 Curl 获取 HTTP 响应字符串

javascript - 日期字符串格式

java - 如何在 JTabbedPane JComponent 面板中创建新行?

java - Eclipse 内容协助不显示方法描述

string - 将 cv::mat 转换为 OpenCV 中的字节串

java - 在字符串中查找中间词的输出没有按预期出现?