首页 > 解决方案 > Perl:最快的匹配?

问题描述

我想在不使用 /s 的情况下做到这一点:

(?:.|\n)+

我希望它很快。

它是更大的正则表达式的一部分,这就是我不能使用 /s 的原因。我已经测试过:

perl -pe 's/(?:.|\n)+//'  #  30 MBytes/s
perl -pe 's/[^\777]+//'   # 124 MBytes/s

它们不如 /s 快:

perl -pe 's/.+//s'        # 164 MBytes/s

我能以某种方式获得与 /s 相同的速度吗?

编辑:

perl -pe 's/(?s).+(?-s)//' # 162 MBytes/s
perl -pe 's/[\d\D]+//'    # 162 MBytes/s
perl -pe 's/[\s\S]+//'    # 161 MBytes/s

这些都是不错的选择。谢谢。

标签: regexperformanceperl

解决方案


您不需要使用任何变通方法。

您可以使用内联修饰符标志(?s)来启用点以跨行匹配并(?-s)禁用此效果。

例如:

(?s).*PATTERN(?-s).*

其中第一个.*匹配任何文本,最后一个.*只匹配到行尾。

您还可以使用修饰符组:

(?s:.*)PATTERN(?-s:.*)

在扩展模式中查看更多信息。


推荐阅读