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

use*_*169 5 regex perl

我已经看过上一篇文章,关于与多个正则表达式的匹配 如何在Perl中匹配多个正则表达式?

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

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

目前我正在使用嵌套的循环但我对速度不是很满意....

谢谢你的建议.

Sch*_*ern 8

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

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

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

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


Dov*_*eld 4

您尝试过使用 grep 吗?

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