有人可以解释一下[0-9]+
和[0-9]++
之间的区别吗?
答案 0 :(得分:14)
PHP用于正则表达式的PCRE引擎支持"possessive quantifiers":
量词随后
+
是“占有欲”。他们吃尽可能多的角色,并且不返回以匹配模式的其余部分。因此.*abc
匹配"aabc"
,但.*+abc
不匹配,因为.*+
会占用整个字符串。占有量词可用于加速处理。
和
如果设置了PCRE_UNGREEDY选项(Perl中没有的选项),那么量词在默认情况下不会贪婪,但是通过跟随问号,可以使个别贪婪。换句话说,它会反转默认行为。
不同之处在于:
/[0-9]+/ - one or more digits; greediness defined by the PCRE_UNGREEDY option
/[0-9]+?/ - one or more digits, but as few as possible (non-greedy)
/[0-9]++/ - one or more digits, but as many as possible (greedy, default)
This snippet在贪婪默认模式下可视化差异。请注意,第一个代码段在功能上与上一个代码段相同,因为默认情况下已经应用了额外的+
(在某种意义上)。
This snippet在应用PCRE_UNGREEDY(默认为默认模式)时可视化差异。了解默认情况如何逆转。
答案 1 :(得分:4)
++
(以及?+
,*+
和{n,m}+
)被称为possessive quantifiers。
[0-9]+
和[0-9]++
都匹配一个或多个ASCII数字,但第二个不允许正则表达式引擎回溯到匹配中,如果这对于整个正则表达式成功是必要的。 / p>
示例:
[0-9]+0
匹配字符串00
,而[0-9]++0
则不匹配。
在第一种情况下,[0-9]+
首先匹配00
,但后退一个字符以允许以下0
匹配。在第二种情况下,++
会阻止此操作,因此整个匹配失败。
并非所有正则表达式都支持此语法;其他一些人实施atomic groups代替(甚至两者)。