regex - 冗长的 Perl 正则表达式

标签 regex perl optimization

这似乎是一个有点奇怪的问题,但无论如何都是重点;

我有一个字符串,需要在多种组合中搜索许多可能出现的字符(因此字符类是毫无疑问的),那么最有效的方法是什么?

我在想要么将它堆叠到一个正则表达式中:

if ($txt =~ /^(?:really |really |long | regex here)$/){}

或者使用几个“较小”的比较,但我认为这不会很有效:

if ($txt =~ /^regex1$/ || $txt =~ /^regex2$/ || $txt =~ /^regex3$/) {}

或者可能嵌套多个 if 比较。

如果您对此问题有任何额外的建议和其他意见,我将不胜感激。 谢谢

最佳答案

从 v5.9.2 开始,Perl 就编译了一组 N 个替代方案,例如:

/string1|string2|string3|string4|string5|.../

进入 trie 数据结构,如果这是模式中的第一件事,甚至使用 Aho-Corasick 匹配来非常快速地找到起点。

这意味着 N 个备选方案的匹配现在将在 O(1) 时间内运行,而不是在 O(N) 时间内运行:

if (/string1/ || /string2/ || /string3/ || /string4/ || /string5/ || ...)

将运行。

因此,您可以获得 O(1) 或 O(N) 的性能:您可以选择。

如果您使用 re "debug"-Mre-debug,Perl 将在您的模式中显示这些 trie 结构。

关于regex - 冗长的 Perl 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909597/

相关文章:

javascript - 我用于查找多个空格的正则表达式如何不匹配换行符?

java - 复杂的键值对

perl - Perl何时自动初始化变量?

c++ - 关于STL内部结构的问题

mysql - 通过将 TEXT 字段拆分为 CHAR(255) 类型的 block 来使 MySQL 表固定

performance - 为什么删除边界检查后我的代码运行速度变慢了?

python - 如何在 python 的正则表达式中指定一系列 unicode 字符?

r - 如何将一列字符串转换为因子列表,使用正则表达式过滤值

linux - 需要更好的数字组合解决方案

java - 将电子邮件从 postfix 转发到 java 应用程序