冗长的perl正则表达式

cyb*_*ard 2 regex optimization perl

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

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

我想要把它堆成一个正则表达式:

if ($txt =~ /^(?:really |really |long | regex here)$/){}
Run Code Online (Sandbox Code Playgroud)

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

if ($txt =~ /^regex1$/ || $txt =~ /^regex2$/ || $txt =~ /^regex3$/) {}
Run Code Online (Sandbox Code Playgroud)

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

我将不胜感激任何有关此问题的额外建议和其他意见.谢谢

tch*_*ist 5

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

/string1|string2|string3|string4|string5|.../
Run Code Online (Sandbox Code Playgroud)

进入一个特里数据结构,如果这是模式中的第一件事,甚至使用Aho-Corasick匹配来很快找到起点.

这意味着你的N个替代品的匹配现在将在O(1)时间而不是在O(N)时间内运行:

if (/string1/ || /string2/ || /string3/ || /string4/ || /string5/ || ...)
Run Code Online (Sandbox Code Playgroud)

将运行.

所以你可以有O(1)或O(N)表现:你的选择.

如果您use re "debug"-Mre-debugPerl将在您的模式中显示这些trie结构.