什么更有效:replaceFirst()或replaceAll()与锚定的正则表达式?

时间:2012-08-31 16:19:14

标签: java regex performance

我们有一个字符串String s = "first.second.third...n-1.n";

两种正则表达式方法中哪一种在Java中效率更高?

s = s.replaceFirst(".*?\\.", "");

s = s.replaceAll('^[^.]+[.]', '');

他们做同样的事情,但我想知道哪一个更快?

区别在于:

  1. 使用锚定正则表达式与replaceFirst()匹配第一个实例

  2. 使用非贪婪*?与非点字符类[^.]

  3. 使用\\.文字与[.]字符类。

  4. 我更希望得到一个答案,可以对这些内容的性能影响进行基准测试或解释。

1 个答案:

答案 0 :(得分:4)

第二个正则表达式更有效率,因为它不会回溯。

这是一篇很好的文章link来解释细节。文章解释了表达式

<.*?>

需要25步,而表达式

<[^>]*>

只需要五个就可以找到<0123456789>字符串中的匹配项,说明正则表达式引擎需要采取的每个步骤才能产生匹配。

\\.[.]之间应该没有区别 - 好的正则表达式引擎会将两个子表达式转换为相同的编译表达式。

使用replaceAll的锚定版本与非锚定replaceFirst的做法不同,因为当点.是第一个字符时,锚定版本将找不到匹配项字符串。您可以将+替换为*来解决此问题。

如果有这种差异,replaceAll将花费更多的时间检查没有其他匹配(并且不会,因为你的表达被锚定),但那不会对于长初始运行不包含点的字符串非常重要。