- 什么是原子组(
(?>expr)
),它有什么用处?在https://www.regular-expressions.info/atomic.html中,唯一的例子是当expr
是交替表达式时,例如正则表达式a(?>bc|b)c
匹配abcc
但不匹配abc
。是否有expr
不是交替表达式的示例? - 原子组和非捕获组(
(?:expr)
)是相同的吗?
(?>expr)
),它有什么用处?在https://www.regular-expressions.info/atomic.html中,唯一的例子是当expr
是交替表达式时,例如正则表达式a(?>bc|b)c
匹配abcc
但不匹配abc
。是否有expr
不是交替表达式的示例?(?:expr)
)是相同的吗?使用原子组时,如果给定的字符串未匹配完整个正则表达式,则正则引擎不会回溯查找更多排列。
每当使用交替项时,如果成功匹配,则正则表达式将立即尝试匹配剩余的表达式,但它将跟踪其他交替可能出现的位置。如果没有匹配剩余的表达式,则正则表达式将返回先前记录的位置并尝试其他组合。如果使用了原子组,则正则表达式引擎将不会跟踪以前的位置,而只会放弃匹配。
上述示例并没有解释使用原子组的目的,它仅演示了如何消除回溯。原子组将用于特定情况,在其中使用了贪婪量词,并且即使没有交替,仍可能存在进一步的组合。
原子组和非捕获组是不同的。非捕获组不保存匹配的值,而原子组在需要进一步组合时禁用回溯。
例如,正则表达式a(?:bc|b)c
可以匹配abcc
和abc
(不捕获匹配),而a(?>bc|c)c
只能匹配abcc
。如果正则表达式是a(?>b|bc)c
,它只会匹配abc
,而a(?:b|bc)c
仍然会匹配两者。
expr
不是交替的例子?(abc)?a
这在abc
和abca
中都能找到匹配。但是当可选部分变成原子时会发生什么?
(?>(abc)?)a
它不再在abc
中找到匹配项。它永远不会放弃abc
,所以最终的a
失败了。
正如其他人所说,还有其他情况可能需要避免回溯,即使它对最终匹配没有影响,以优化您的正则表达式。