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

时间:2010-08-19 13:40:51

标签: java string

我在Java中找到了带有正则表达式底层的String.replaceAll()。它在短串中工作正常。 但是在长字符串的情况下,我需要一个更有效的算法而不是String.replaceAll()。 有人可以提供建议吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

如果您想进行增量替换,可以使用明确的appendReplacement/Tail循环来StringBuffer(遗憾的是,暂时没有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的实施方式。

此方法的好处在于,由于您可以完全控制替换迭代,因此您无需在任何给定时间将整个输出存储在内存中,因为它可能很长String。您可以逐步构建输出,定期将StringBuffer内容刷新到磁盘。也就是说,使用此方法可以比使用replaceAll更多内存效率

(您还可以执行当前替换语法不支持的花哨替换,例如toUpperCase()转换。)

请注意,Matcher的增强请求可以附加到任何Appendable。如果获得批准,您不仅可以使用StringBuilder,还可以直接替换为例如{1}}。一个FileWriter

相关问题

另见

答案 1 :(得分:0)

您可以尝试String.replace(CharSequence target, CharSequence replacement)。它仍然使用模式和匹配器,但target不是正则表达式。