java - 正则表达式性能 VS 纯粹迭代的最佳实践

标签 java regex performance big-o

我想知道是否有关于何时使用正则表达式 VS "string".contains("anotherString") 和/或其他字符串 API 调用的通用指南?

虽然上面给出的 .contains() 的决定是微不足道的(如果你可以在一次调用中完成,为什么还要使用正则表达式),现实生活带来了更复杂的选择。例如,调用两次 .contains() 还是调用一个正则表达式更好?

我的经验法则是始终使用正则表达式,除非这可以用单个 API 调用代替。这可以防止代码膨胀,但从代码可读性的角度来看可能不太好,尤其是在正则表达式趋于变大的情况下。

另一个经常被忽视的论点是性能。我怎么知道这个正则表达式需要多少次迭代(如“Big O”)?它会比纯粹的迭代更快吗?不知何故,每个人都认为一旦正则表达式看起来比 5 个 if 语句短,它一定更快。但情况总是如此吗?如果无法提前预编译正则表达式,这一点尤其重要。

最佳答案

RegexBuddy有一个内置的正则表达式调试器。它显示正则表达式引擎需要多少步才能找到匹配项或找不到匹配项。通过对不同长度的字符串使用调试器,您可以了解正则表达式的复杂性(大 O)。如果您在 RegexBuddy 的帮助文件的索引中查找“基准测试”,您将获得更多关于如何解释它的提示。

在判断正则表达式的性能时,测试正则表达式未能找到匹配项的情况尤为重要。很容易编写一个正则表达式在线性时间内找到它的匹配项,但在我称之为 catastrophic backtracking 的情况下在指数时间内失败。 .

以你的 5 个 if 语句为例,正则表达式 one|two|three|four|five 扫描输入字符串一次,当 o遇到 tf。但是 5 个 if 语句检查字符串是否包含一个单词,如果找不到任何单词,将搜索整个字符串 5 次。如果 five 出现在字符串的开头,则正则表达式会立即找到匹配项,而前 4 个 if 语句在第 5 个 if 语句找到匹配项之前扫描整个字符串是徒劳的。

关于java - 正则表达式性能 VS 纯粹迭代的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1796226/

相关文章:

c# - 如何在正则表达式列表中找到与我的输入匹配的第一个正则表达式?

jquery选择器性能

java - 保存在 Java 桌面应用程序和网站上使用的个人用户设置的最佳方式

java - 在 Java 6 中解析日期时处理时区

java - Java 如何将一个方法的变量变成另一个方法中的变量?

java - 使用正则表达式从 FASTA 中提取 DNA

java - 如何在 Android 游戏中重新启动 Java 线程?

至少有一个 1 和偶数个 0 的二进制字符串的正则表达式

html - 制作像国际象棋一样的巨大网格最轻的方法是什么?

按日期选择博客文章浏览量的 MySQL 性能