【发布时间】:2011-04-20 01:46:08
【问题描述】:
我有一个类正在做大量的文本处理。对于每个长度为 100->2000 个字符的字符串,我执行 30 种不同的字符串替换。
例子:
string modified;
for(int i = 0; i < num_strings; i++){
modified = runReplacements(strs[i]);
//do stuff
}
public runReplacements(String str){
str = str.replace("foo","bar");
str = str.replace("baz","beef");
....
return str;
}
'foo'、'baz' 和所有其他“目标”预计只会出现一次并且是字符串文字(不需要实际的正则表达式)。
如你所想,我很关心性能:)
鉴于此,
replaceFirst()似乎是一个糟糕的选择,因为它不会使用Pattern.LITERAL并且会执行不需要的额外处理。replace()似乎是一个糟糕的选择,因为它会遍历整个字符串以寻找要替换的多个实例。
此外,由于我的替换文本每次都相同,因此我编写自己的代码似乎是有意义的,否则 String.replaceFirst() 或 String.replace() 将在后台每次执行 Pattern.compile。认为我应该编写自己的代码,这是我的想法:
对每个需要的文字替换执行
Pattern.compile()仅一次(无需每次都重新编译)(即 p1 - p30)然后对每个 pX 执行以下操作:
p1.matcher(str).replaceFirst(Matcher.quoteReplacement("desiredReplacement"));
这样我在第一次替换时就放弃了(而不是遍历整个字符串),我使用的是 literal 与 regex,我没有做每次迭代都重新编译。
那么,哪个性能最好?
【问题讨论】:
标签: java regex string performance replace