这似乎有些奇怪的问题,但无论如何要点;
我有一个字符串,我需要在几个组合中搜索许多可能的字符出现(所以字符类是不可能的),那么最有效的方法是什么?
我在考虑将其叠加到一个正则表达式中:
if ($txt =~ /^(?:really |really |long | regex here)$/){}
或使用几个'较小'的比较,但我认为这不会很有效:
if ($txt =~ /^regex1$/ || $txt =~ /^regex2$/ || $txt =~ /^regex3$/) {}
或者如果比较可能会嵌套几个。
我将非常感谢有关此问题的任何额外建议和其他意见。 感谢
答案 0 :(得分:5)
自从回到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 )表现:你的选择。
如果您use re "debug"
或-Mre-debug
,Perl会在您的模式中显示这些特里结构。
答案 1 :(得分:0)
这不会取代一些时间测试。如果可能,我建议尽可能使用o
标志,以便Perl不会在每次评估时重新编译(大)正则表达式。当然,只有当每个评估的字符组合没有改变时,这才有可能。
答案 2 :(得分:0)
我认为这取决于你有多长的正则表达式。有时更好地划分很长的表达。