我通过在字符串RegEx ^(?>A|.)*C中包含原子组来提供一些匹配,这可以看到这里。
在调试器选项卡中,将显示引擎试图达到成功匹配的所有步骤,但我无法找到原因,也不知道为什么会发生某些步骤。我的问题如下:

发布于 2016-06-22 04:12:32
我同意这让人困惑。当我们谈到回溯时,我们通常意味着regex引擎在文本中向后移动,放弃了它以前使用过的字符。您的正则表达式只执行一次,在步骤14中,(?>A|.)*必须放弃C,以便正则表达式中的C可以匹配它。
但是,调试器还将回溯标签应用于试图匹配某些内容但失败的步骤。这就是步骤6、9和12所发生的事情,当它试图将A与B、C、以及nothing (字符串的末尾)匹配时。当然,根据这一推理,第13步(它试图将.与任何东西匹配)也应该被贴上回溯标签。
RegexBuddy的调试器标记为回溯。这是输出:

你可以看到列出的步骤较少,但不要问我它遗漏了什么。RegexBuddy提供的信息太少,无法确定Regex101是否提供了太多信息。:P
我应该注意到,在您的示例中,原子组根本没有任何影响。您可以切换到非捕获组,输出将完全相同。(演示)如果你想看到它们的效果,把量词放在原子组中。(演示)
发布于 2016-06-22 01:53:47
原子组(?> )*自动丢弃组内任何令牌记住的所有回溯位置。它将匹配(之后不要回溯) (0次或更多次(尽可能匹配))
步骤7 .与B匹配,原子组删除所有回溯位置
步骤8:作为一个读取字符串的人,很容易看到源字符串中的最后一个字符是C,但是正则表达式引擎看到贪婪的*,这迫使引擎继续测试字符。此时,引擎无法通过字符串中的C来查看它是最后一个字符,因此它必须首先回溯以尝试在匹配中包含C,这将导致我们理解为什么会发生额外的步骤9到13。
Step 9 the expression attempts to match the `C` with an `A` but this fails so it backtracks to attempt the alternation
Step 10 the `.` then attempts to match the `C` and succeeds
Step 12 the expression is now testing the end of the string to see if it matches the `A` and fails to match the end of the string
Step 13 the expression tests the end of the string with a `.` and fails so it backtracks
Step 14 it back tracked so that the `C` at the end of your expression will match the `C` in the input stringhttps://stackoverflow.com/questions/37956483
复制相似问题