基于正则表达式替换的效率

时间:2012-07-03 11:10:17

标签: java regex performance

以下哪项更有效,更好用?

value.replaceAll("['‘’`]","")

value.replaceAll("['‘’`]+","")

我的猜测是,对于没有替换字符的字符串,或者至少没有它们的序列,两者是相同的,或者第一个更好的是不那么复杂。

但如果我正在查看字符串的子序列被替换的字符串怎么办? 第二个会更好吗?

'abababababababab'.replaceAll("ab","") 

v.s。

'abababababababab'.replaceAll("(ab)+","") 

如果这对于这个问题很重要,我正在使用Java。

1 个答案:

答案 0 :(得分:1)

根据分析,我会说第一个选项比第二个更快。虽然我必须说这种差异不容易衡量,除非你有一个巨大的字符串作为输入(或复杂的正则表达式)。

所以我们打电话给这个regex1:

'abababababababab'.replaceAll("ab","")

这个正则表达式:

'abababababababab'.replaceAll("(ab)+","")

我们从Java API知道replaceAll会看到both the conditions as a regex并尝试替换正则表达式引擎之后的字符串。

我们可以看到regex1只有char序列;而且regex2有一个group,一个char序列和一个必须相应解释的quantifier metacharacters(更多信息here)。因此regex2需要比regex1更多的处理。

一般来说,对于大多数用途来说,这两个选项都非常快。通过阅读本文,您可以更详细地了解该流程:Regular Expression Matching Can Be Simple And Fast

尽管如此,使用PatternMatcher更复杂的正则表达式是一个更快的选择...(更多信息here)。

此方案中我建议的其他阅读材料是:Optimizing Regular Expressions in Java