Skip to main content
 首页 » 编程设计

regex之冗长的 Perl 正则表达式

2025年05月04日144del

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

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

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

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 结构。