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

DVK*_*DVK 5 java regex performance

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

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

s = s.replaceFirst(".*?\\.", "");
Run Code Online (Sandbox Code Playgroud)

要么

s = s.replaceAll('^[^.]+[.]', '');
Run Code Online (Sandbox Code Playgroud)

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

不同之处是:

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

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

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

我更希望得到一个答案,可以对这些分别的表现效果进行基准测试或解释.

das*_*ght 4

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

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

<.*?>
Run Code Online (Sandbox Code Playgroud)

需要 25 个步骤,而表达式

<[^>]*>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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