我正在查看this answer这个问题:Regex nested parentheses,并且正在考虑的是,它不应该是一个量化的原子组(?> list | of | alternates )*
,而应该是一个原子量化的组(?> (?: list | of | alternates )* )
。我错了吗?正则表达式世界中它们是相同还是不同?特别是在.NET实现方面?
我个人认为它们不同,我通常使用perl正则表达式转换为(?: list | of | alternates )*+
。无论如何,这对我来说要清楚得多,说明如果需要,我想在这个特殊的正则表达式之前回溯(原子量化组)。然而,也许这是作为设计决策实施的,其中思路是量化的原子团没有用?
答案 0 :(得分:3)
当原子组被称为独立表达时,
回溯确实发生在它内部,就像其他任何地方一样。
不同之处在于原子组无法控制回溯 外部机制。
因此,原子组的每次量化传递仅计算单
不会导致回溯的实例。
但是,如果将量词放在里面的群集非量化的中
原子组,影响是整个内容不会影响
外部回溯。
这是重要的粒度。
示例
(?>a|b|c)*abc
将匹配aaaaaabbbbbbbbbbbabc
其中
(?>(?:a|b|c)*)abc
与aaaaaabbbbbbbbbbbabc
不匹配
因为(?:a|b|c)*
子句全部消耗它,没有留给它的余地
找abc
。
一个好的经验法则是:
如果量词是外部到原子组,它可以控制回溯 外部。
如果量词是内部到原子组,它可以控制回溯
仅在内部。
而且,当你量化一个原子组时,每次通过时,流都会退出 分组,使 传递'结果(整体)有资格被撤回。