我正在阅读PCRE文档,我注意到占有量词+和只有一次的子模式(?>),也称为原子组,在概念上有些相似.有什么实质性的区别吗?
(?>) 实际上是原子分组.
来自regular-expressions.info上的Atomic Grouping:
原子组是一个组,当正则表达式引擎从它退出时,它会自动丢弃由组内任何令牌记住的所有回溯位置.原子组是非捕获的.语法是(?> group).
来自占有量词在regular-expressions.info:
占有量词是防止正则表达式引擎尝试所有排列的一种方法.这主要是出于性能原因.您还可以使用占有量词来消除某些匹配.
从同一页面:
从技术上讲,占有量词是将原子组置于单个量词周围的符号方便.支持占有量词的所有正则表达式都支持原子分组.但并非所有支持原子分组的正则表达式都支持占有量词.使用这些风格,您可以使用原子组获得完全相同的结果.
基本上,而不是
X*+写,写(?>X*).重要的是要注意量化的标记X和量词都在原子组内.即使X是一个组,你仍然需要在它周围加一个额外的原子团来达到同样的效果.(?:a|b)*+相当于(?>(?:a|b)*)但不是(?>a|b)*.后者是一个有效的正则表达式,但在用作较大正则表达式的一部分时,它不会产生相同的效果.