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(默认情况下为默认模式)时,此片段会显示差异.查看默认值是如何反转的.
++
(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
匹配。在第二种情况下,它++
阻止了这种情况,因此整个匹配失败。
并非所有正则表达式风格都支持此语法;其他一些则实现原子组(或者甚至两者)。