重复交替组内的前瞻行为

时间:2016-09-29 10:51:00

标签: regex pcre

(?:(?=abc)|[abc])+之类的正则表达式将匹配由abc组成的字符串,直到满足前瞻条件。 例如。对于字符串acbababcaaa,它将匹配acbab - 在第一个abc前面停止,但如果它过于贪婪,它可以前进到字符串的末尾。

我们可以通过在模式的末尾添加$来强制执行此操作((?:(?=abc)|[abc])+$) - 现在它实际上与字符串的结尾匹配。

当我们现在将重复更改为拥有((?:(?=abc)|[abc])++$) - 它将匹配bcaaa - 因此第一个位置,前瞻不再匹配。

有人能解释这些行为的原因吗?

1 个答案:

答案 0 :(得分:1)

当您强制引擎推进时,它不会再回溯到第一组(?:...)

在看到abc后,整个组中存在正向前瞻引擎,并期望输入字符串$结束。它不在那里,也不能回溯尝试交替的另一面,因此它完全失败,[abc]之前消耗的所有字符都被释放,指针被重置为整个模式的前一个开始位置的下一个字符。 / p>

您可以使用原子组(?>(?=abc)|[abc])+$编写它以更明确地表达差异。只要输入字符串中的abc未跟随字符串$的结尾,此过程就会继续并失败。

这就是bcaaa字符最后匹配的原因,因为在使用a之前bcaaa之后永远不会发生积极前瞻。