这似乎是一个有点奇怪的问题,但无论如何都是重点;
我有一个字符串,需要在多种组合中搜索许多可能出现的字符(因此字符类是毫无疑问的),那么最有效的方法是什么?
我在想要么将它堆叠到一个正则表达式中:
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/