5

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

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

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

或者

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

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

区别在于:

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

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

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

我更喜欢一个可以分别对它们的性能影响进行基准测试或解释的答案。

4

1 回答 1

4

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

这是一篇解释详细信息的好文章的链接。文章解释了如何表达

<.*?>

需要 25 步,而表达式

<[^>]*>

只需 5 次即可在<0123456789>字符串中找到匹配项,说明正则表达式引擎需要执行的每个步骤才能生成匹配项。

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

锚定版本与replaceAll非锚定不同,因为当点是字符串中的第一个字符replaceFirst时,锚定版本将找不到匹配项。.您可以通过替换+*.

消除这种差异后,replaceAll将花费更多时间检查是否没有其他匹配项(并且不会有,因为您的表达式是锚定的),但这对于初始运行时间长且不包含任何匹配项的字符串并不重要点。

于 2012-08-31T16:21:57.110 回答