我们有一个字符串String s = "first.second.third...n-1.n";
两种正则表达式方法中哪一种在Java中效率更高?
s = s.replaceFirst(".*?\\.", "");
或
s = s.replaceAll('^[^.]+[.]', '');
他们做同样的事情,但我想知道哪一个更快?
区别在于:
使用锚定正则表达式与replaceFirst()
匹配第一个实例
使用非贪婪*?
与非点字符类[^.]
使用\\.
文字与[.]
字符类。
我更希望得到一个答案,可以对这些内容的性能影响进行基准测试或解释。
答案 0 :(得分:4)
第二个正则表达式更有效率,因为它不会回溯。
这是一篇很好的文章link来解释细节。文章解释了表达式
<.*?>
需要25步,而表达式
<[^>]*>
只需要五个就可以找到<0123456789>
字符串中的匹配项,说明正则表达式引擎需要采取的每个步骤才能产生匹配。
\\.
和[.]
之间应该没有区别 - 好的正则表达式引擎会将两个子表达式转换为相同的编译表达式。
使用replaceAll
的锚定版本与非锚定replaceFirst
的做法不同,因为当点.
是第一个字符时,锚定版本将找不到匹配项字符串。您可以将+
替换为*
来解决此问题。
如果有这种差异,replaceAll
将花费更多的时间检查没有其他匹配(并且不会,因为你的表达被锚定),但那不会对于长初始运行不包含点的字符串非常重要。