2011-05-31 135 views
7

有人能解释我有什么区别[0-9]+[0-9]++[0-9] +和[0-9] ++之间的区别是什么?

+2

这不是一个重复的东西,但应该回答这个问题:http://stackoverflow.com/questions/4489551/what-is-double-plus-in-regular-expressions – Spudley 2011-05-31 11:06:26

+0

我从来没有听说过' ++'在正则表达式中,似乎很多其他人也没有,但有点挖掘确实表明它是有效的。 – Spudley 2011-05-31 11:10:53

+0

对不起,我没有找到。 – user557108 2011-05-31 11:11:04

回答

14

的PCRE引擎,它使用PHP的正则表达式,支持"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(默认为默认模式)时可视化差异。看看默认值是如何颠倒的。

+0

为什么这会降低投票率?这个问题最初有一个'php'标签。 – thirtydot 2011-05-31 11:13:47

+0

@thirtydot:它仍然如此。 – 2011-05-31 11:14:59

+2

只因为我加回来:) – thirtydot 2011-05-31 11:17:45

4

++(和?+,*+{n,m}+)被称为possessive quantifiers

[0-9]+[0-9]++都匹配一个或多个ASCII数字,但第二个将不允许正则表达式引擎回溯到匹配,如果整个正则表达式成功需要这样做。

实施例:

[0-9]+0 

字符串00相匹配,而[0-9]++0没有。

在第一种情况下,[0-9]+首先匹配00,但后退一个字符以允许匹配以下0。在第二种情况下,++阻止了这一点,因此整个比赛失败。

并非所有的正则表达式都支持这种语法;其他一些实施atomic groups(或甚至两个)。

+0

谢谢你的回答! – user557108 2011-05-31 11:18:31

相关问题