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)
他们做同样的事情,但我想知道哪一个更快?
不同之处是:
使用锚定的正则表达式与replaceFirst()仅匹配第一个实例
使用非贪婪*?与非点字符类[^.]
使用\\.文字与[.]字符类.
我更希望得到一个答案,可以对这些分别的表现效果进行基准测试或解释.
第二个正则表达式更有效,因为它不会回溯。
这是一篇解释细节的好文章的链接。文章解释了如何表达
<.*?>
Run Code Online (Sandbox Code Playgroud)
需要 25 个步骤,而表达式
<[^>]*>
Run Code Online (Sandbox Code Playgroud)
只需五步即可在<0123456789>字符串中找到匹配项,说明了正则表达式引擎生成匹配项所需执行的每个步骤。
\\.和之间应该没有区别[.]- 好的正则表达式引擎会将两个子表达式转换为相同的编译表达式。
锚定版本与replaceAll非锚定版本执行的操作不同,因为当点是字符串中的第一个字符replaceFirst时,锚定版本将找不到匹配项。.您可以通过替换+为 来解决此问题*。
消除这种差异后,replaceAll将花费更多时间检查是否没有其他匹配项(并且不会有,因为您的表达式已锚定),但这对于初始运行时间长且不包含任何内容的字符串来说并不重要。点。
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |