昨天我问了一个问题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
并完成。不需要回溯。
当有太多的回溯时,会发生错误。好的,所以整个事情应该像这样工作。正则表达式引擎开始匹配,没有回溯就结束,完成匹配,不需要回溯,不涉及错误。为什么它没有那样工作?
答案 0 :(得分:2)
affffffa
没有回溯,但这并不意味着该模式无法回溯。它需要回溯才能找到affffff
不匹配的内容。因此,模式需要准备回溯。