注意:此问题是another answer的结果,截至目前,其所有评论都已删除。
如果在RegEx中使用环视构造,则会在关闭括号之前发生回溯或类型的。我知道这个回溯是Perl和PCRE调试器的输出:
问题是这个回溯是什么,为什么它在那里以及如何解释为backtrack?
答案 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'
。