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

2024-02-22

我想知道何时使用正则表达式 VS 是否有任何一般准则"string".contains("anotherString")和/或其他 String API 调用?

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

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

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


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

在判断正则表达式的性能时,测试正则表达式的情况尤为重要fails找到匹配的。编写一个正则表达式非常容易,它可以在线性时间内找到匹配项,但在我称为的情况下在指数时间内失败灾难性的回溯 http://www.regular-expressions.info/catastrophic.html.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式性能 VS 纯粹迭代的最佳实践 的相关文章

随机推荐