原子量化组是否与量化原子组相同?

时间:2018-01-18 21:48:42

标签: .net regex regex-group regex-greedy

我正在查看this answer这个问题:Regex nested parentheses,并且正在考虑的是,它不应该是一个量化的原子组(?> list | of | alternates )*,而应该是一个原子量化的组(?> (?: list | of | alternates )* ) 。我错了吗?正则表达式世界中它们是相同还是不同?特别是在.NET实现方面?

我个人认为它们不同,我通常使用perl正则表达式转换为(?: list | of | alternates )*+。无论如何,这对我来说要清楚得多,说明如果需要,我想在这个特殊的正则表达式之前回溯(原子量化组)。然而,也许这是作为设计决策实施的,其中思路是量化的原子团没有用?

1 个答案:

答案 0 :(得分:3)

当原子组被称为独立表达时,
回溯确实发生在它内部,就像其他任何地方一样。

不同之处在于原子组无法控制回溯 外部机制。

因此,原子组的每次量化传递仅计算
不会导致回溯的实例。

但是,如果将量词放在里面的群集非量化的中 原子组,影响是整个内容不会影响
外部回溯。

这是重要的粒度。

示例

(?>a|b|c)*abc将匹配aaaaaabbbbbbbbbbbabc

其中

(?>(?:a|b|c)*)abcaaaaaabbbbbbbbbbbabc不匹配 因为(?:a|b|c)*子句全部消耗它,没有留给它的余地 找abc

一个好的经验法则是:

如果量词是外部到原子组,它可以控制回溯 外部。

如果量词是内部到原子组,它可以控制回溯
仅在内部。

而且,当你量化一个原子组时,每次通过时,流都会退出 分组,使 传递'结果(整体)有资格被撤回。