冗长的perl正则表达式

时间:2011-02-05 20:56:40

标签: regex perl optimization

这似乎有些奇怪的问题,但无论如何要点;

我有一个字符串,我需要在几个组合中搜索许多可能的字符出现(所以字符类是不可能的),那么最有效的方法是什么?

我在考虑将其叠加到一个正则表达式中:

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

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

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

或者如果比较可能会嵌套几个。

我将非常感谢有关此问题的任何额外建议和其他意见。 感谢

3 个答案:

答案 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)

我认为这取决于你有多长的正则表达式。有时更好地划分很长的表达。