我在Java中找到了带有正则表达式底层的String.replaceAll()。它在短串中工作正常。 但是在长字符串的情况下,我需要一个更有效的算法而不是String.replaceAll()。 有人可以提供建议吗? 谢谢!
答案 0 :(得分:4)
如果您想进行增量替换,可以使用明确的appendReplacement/Tail
循环来StringBuffer
(遗憾的是,暂时没有StringBuilder
重载。)
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
。
StringBuilder
and StringBuffer
in Java Matcher
should make more use of Appendable
Matcher
附加到任何Appendable
答案 1 :(得分:0)
您可以尝试String.replace(CharSequence target, CharSequence replacement)
。它仍然使用模式和匹配器,但target
不是正则表达式。