(?:(?=abc)|[abc])+
之类的正则表达式将匹配由a
,b
和c
组成的字符串,直到满足前瞻条件。
例如。对于字符串acbababcaaa
,它将匹配acbab
- 在第一个abc
前面停止,但如果它过于贪婪,它可以前进到字符串的末尾。
我们可以通过在模式的末尾添加$
来强制执行此操作((?:(?=abc)|[abc])+$
) - 现在它实际上与字符串的结尾匹配。
当我们现在将重复更改为拥有((?:(?=abc)|[abc])++$
) - 它将匹配bcaaa
- 因此第一个位置,前瞻不再匹配。
有人能解释这些行为的原因吗?
答案 0 :(得分:1)
当您强制引擎推进时,它不会再回溯到第一组(?:...)
。
在看到abc
后,整个组中存在正向前瞻引擎,并期望输入字符串$
结束。它不在那里,也不能回溯尝试交替的另一面,因此它完全失败,[abc]
之前消耗的所有字符都被释放,指针被重置为整个模式的前一个开始位置的下一个字符。 / p>
您可以使用原子组(?>(?=abc)|[abc])+$
编写它以更明确地表达差异。只要输入字符串中的abc
未跟随字符串$
的结尾,此过程就会继续并失败。
这就是bcaaa
字符最后匹配的原因,因为在使用a
之前bcaaa
之后永远不会发生积极前瞻。