【发布时间】:2011-09-09 21:10:33
【问题描述】:
我有一段旧代码可以在字符串中查找和替换标记。
它接收from 和to 对的映射,遍历它们并针对每一对,遍历目标字符串,使用indexOf() 查找from,并将其替换为值的to。它在StringBuffer 上完成所有工作并最终返回String。
我用这一行替换了该代码:replaceAll("[,. ]*", "");
我还进行了一些比较性能测试。
在比较 1,000,000 迭代时,我得到了:
旧代码:1287ms
新代码:4605ms
3 倍!
然后我尝试将其替换为 3 次调用 replace:replace(",", "");replace(".", "");replace(" ", "");
结果如下:
旧代码:1295
新代码:3524
2 倍!
知道为什么replace 和replaceAll 效率这么低吗?我可以做点什么让它更快吗?
编辑:感谢所有答案 - 主要问题确实是 [,. ]* 没有做我想做的事。将其更改为 [,. ]+ 几乎等于非基于正则表达式的解决方案的性能。
使用预编译的正则表达式会有所帮助,但效果不佳。 (这是一个非常适用于我的问题的解决方案。
测试代码:
Replace string with Regex: [,. ]*
Replace string with Regex: [,. ]+
Replace string with Regex: [,. ]+ and Pre-Compiled Pattern
【问题讨论】:
-
哦,正则表达式的乐趣...