如何在Perl中匹配多个正则表达式?

时间:2011-05-21 17:36:52

标签: regex perl

我之前看过这篇关于匹配多个正则表达式的帖子 How can I match against multiple regexes in Perl?

我正在寻找一种最快的方法来匹配数组中包含的所有值与一个非常大的文件(500 MB)。

从stdin读取模式,可能包含必须在正则表达式中使用的特殊字符(锚点,字符类等)。当所有模式包含在当前行中时,必须进行匹配。

目前我正在使用嵌套for循环,但我对速度不太满意....

感谢您的建议。

2 个答案:

答案 0 :(得分:8)

按照您关联的帖子中的建议尝试Regexp::Assemble,并将其与grep等迭代方法进行比较。 Regexp :: Assemble应该产生最快的解决方案,因为Perl可以优化连接的正则表达式而不是扫描每一个的整行。由于您事先不知道您的输入,ymmv。

您使用的Perl版本会影响性能。 5.10为此目的引入了许多优化(参见“tries”)。其中一个最大的用例是像SpamAssassin这样的垃圾邮件扫描程序,它构建了所有扫描模式的大正则表达式,就像Regexp :: Assemble一样。

最后,由于您的输入太大,将正则表达式组装到文件中然后运行grep -P -f $regex_file $big_file可能是值得的。 -P告诉grep使用Perl兼容的正则表达式。该文件用于避免shell引用或命令大小限制。 grep可能会打破Perl的大门。

最后,您将不得不进行基准测试。

答案 1 :(得分:4)

您尝试使用grep吗?

while($line=<>) {
    if (scalar(grep($line=~/$_/,@regexps))==scalar(@regexps)) {
       # ... All matched
    }
}