占有量词和一次性子模式之间的区别

Des*_*ume 4 php regex pcre

我正在阅读PCRE文档,我注意到占有量词+和只有一次的子模式(?>),也称为原子组,在概念上有些相似.有什么实质性的区别吗?

anu*_*ava 7

(?>) 实际上是原子分组.

来自regular-expressions.info上的Atomic Grouping:

原子组是一个组,当正则表达式引擎从它退出时,它会自动丢弃由组内任何令牌记住的所有回溯位置.原子组是非捕获的.语法是(?> group).

来自占有量词在regular-expressions.info:

占有量词是防止正则表达式引擎尝试所有排列的一种方法.这主要是出于性能原因.您还可以使用占有量词来消除某些匹配.

从同一页面:

从技术上讲,占有量词是将原子组置于单个量词周围的符号方便.支持占有量词的所有正则表达式都支持原子分组.但并非所有支持原子分组的正则表达式都支持占有量词.使用这些风格,您可以使用原子组获得完全相同的结果.

基本上,而不是X*+写,写(?>X*).重要的是要注意量化的标记X和量词都在原子组内.即使X是一个组,你仍然需要在它周围加一个额外的原子团来达到同样的效果.(?:a|b)*+相当于(?>(?:a|b)*)但不是(?>a|b)*.后者是一个有效的正则表达式,但在用作较大正则表达式的一部分时,它不会产生相同的效果.