在关闭括号之前看起来回溯

时间:2016-09-06 08:10:45

标签: regex perl pcre

注意:此问题是another answer的结果,截至目前,其所有评论都已删除。

如果在RegEx中使用环视构造,则会在关闭括号之前发生回溯或类型的。我知道这个回溯是Perl和PCRE调试器的输出:

enter image description here

问题是这个回溯是什么,为什么它在那里以及如何解释为backtrack

1 个答案:

答案 0 :(得分:4)

回溯是一个谎言。

这只是regex101调试器实现方式的结果。它使用名为PCRE_AUTO_CALLOUT的PCRE功能(标志)。该标志告诉PCRE引擎在匹配的每个步骤调用用户定义的函数。此函数接收当前匹配状态作为输入。

问题是,当真正回溯时,PCRE 不会告诉标注。 Regex101必须从匹配状态推断出来。

正如您所看到的,在“backtrack”发生之前的步骤中,当前匹配的文本为a_,就在您离开前瞻后,它又恢复为{ {1}}。 Regex101注意到匹配的文本更短,因此它推断出回溯必定已经发生,并且您注意到了令人困惑的结果。

作为参考,这里是启用了自动标注的模式的内部PCRE表示:

a

如您所见,那里没有分支操作码,只有$ pcretest PCRE version 8.38 2015-11-23 re> /a(?=_)_b/DC ------------------------------------------------------------------ 0 59 Bra 3 Callout 255 0 1 9 a 11 Callout 255 1 5 17 17 Assert 20 Callout 255 4 1 26 _ 28 Callout 255 5 0 34 17 Ket 37 Callout 255 6 1 43 _ 45 Callout 255 7 1 51 b 53 Callout 255 8 0 59 59 Ket 62 End ------------------------------------------------------------------ Capturing subpattern count = 0 Options: First char = 'a' Need char = 'b'