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

标签 java regex performance

以下哪项会更有效、更好用?

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

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

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

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

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

对比

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

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

最佳答案

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

所以让我们调用这个 regex1:

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

还有这个正则表达式 2:

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

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

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

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

仍然,使用 PatternMatcher对于更复杂的正则表达式是一个更快的选择...(更多信息 here)。

在这种情况下,我推荐的另外一本书是:Optimizing Regular Expressions in Java

关于java - 基于正则表达式的替换效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309681/

相关文章:

php - 如何使用 PHP + JS +(MySQL?)+(AJAX?)进行快速、轻量级、经济的在线聊天

.NET 客户端并发性能

java - OpenClover 如何计算分支数?

java - boolean 递归中的 "unreachable statement"

ruby-on-rails - 如何替换字符串并保留大写?

c# - 用 Razor 替换正则表达式函数

jQuery 性能调优 : Does context always matter?

java - 使用 Maven 构建企业应用程序

java - 我可以实例化一个异常并保留它以备后用,并避免 coSTLy 堆栈跟踪(如果它从未抛出)吗?

regex - vim 正则表达式匹配方括号不起作用