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

use*_*108 7 php regex

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

Lig*_*ica 15

PHP用于正则表达式的PCRE引擎支持"占有量词":

随后的量词+是"占有欲".他们吃尽可能多的角色,并且不返回以匹配模式的其余部分.因此.*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)
Run Code Online (Sandbox Code Playgroud)

此片段在贪婪默认模式下可视化差异.请注意,第一个片段在功能上与最后一个片段相同,因为+默认情况下已经应用了(在某种意义上)附加片段.

应用PCRE_UNGREEDY(默认情况下为默认模式)时,此片段会显示差异.查看默认值是如何反转的.

  • 只是因为我加了回来:) (2认同)

Tim*_*ker 5

++(and ?+, *+and {n,m}+) 称为所有格量词

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

例子:

[0-9]+0
Run Code Online (Sandbox Code Playgroud)

匹配字符串00,反之[0-9]++0则不匹配。

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

并非所有正则表达式风格都支持此语法;其他一些则实现原子组(或者甚至两者)。