[0-9] +和[0-9] ++有什么区别?

时间:2011-05-31 11:02:03

标签: php regex

有人可以解释一下[0-9]+[0-9]++之间的区别吗?

2 个答案:

答案 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代替(甚至两者)。