为什么回溯涉及这个Perl正则表达式匹配?

时间:2014-10-07 17:17:16

标签: regex perl

昨天我问了一个问题latest Perl won't match certain regexes more than 32768 characters long来解释原因

>./perl -e 'print (("a".("f"x32768)."a") =~ /a(?:[^a]|bb)*a/)'
由于Perl正则表达式的回溯深度限制/错误,

无法按预期工作(不匹配)并且答案是正确的。

为什么以上匹配涉及回溯?第一个a匹配,然后,所有f匹配[^a]*,不需要替代bb,然后最后a是不[^a]bb,然后引擎停止匹配([^a]|bb)*,然后匹配最后a并完成。不需要回溯。

当有太多的回溯时,会发生错误。好的,所以整个事情应该像这样工作。正则表达式引擎开始匹配,没有回溯就结束,完成匹配,不需要回溯,不涉及错误。为什么它没有那样工作?

1 个答案:

答案 0 :(得分:2)

affffffa没有回溯,但这并不意味着该模式无法回溯。它需要回溯才能找到affffff不匹配的内容。因此,模式需要准备回溯。