我正在阅读PCRE文档,发现占有量词+
和一次性子模式(?>)
,也称为原子组,在概念上有些相似。它们之间是否有实质性的区别呢?
(?>)
实际上是原子组。根据regular-expressions.info的描述,当正则表达式引擎退出原子组时,自动丢弃组内任何标记记住的所有回溯位置。原子组不捕获匹配项。语法为(?>group)。x++
与(?>x+)
是相同的"。(?>X+)
与X++
并不完全相同。因为在括号内,正则表达式引擎有可能回溯,因此正则表达式引擎始终记录原子组内的回溯位置(但在括号关闭后会忘记它们),这当然不适用于占有量词。例如:aaaabbbb
(?>a+)ab
作为a++ab
将失败,因为正则表达式引擎在原子组关闭后无法回溯。(?>a+ab)
将成功,因为回溯位置始终记录在原子组中。
(?:a+|ab)+(?<!a)b
将成功,但(?>a+|ab)+(?<!a)b
将失败,因为每次重复之间都会关闭括号。(?>X+)
的同义词不是X++
,而是(?:X+){1}+
。(?:X+){1}+
中使用 {1}
,难道我们不能使用 (?:X+)+
吗? - anubhava{1}+
只是一种人为的方法,用于使非捕获组成为原子组(仅用于解释目的,完全没有用处,因为有原子组)。 (?:X+)+
将重复非捕获组(这不是我在示例中要寻找的),而且根本不是原子或占有的。 - Casimir et Hippolyte