php undertsanding greedy vs. nongreedy matching

sli*_*khi 7 php regex

这个:

preg_match('~foo(.*?)(bar)?~','foo bar',$m);
Run Code Online (Sandbox Code Playgroud)

给我这个:

Array
(
    [0] => foo
    [1] => 
)
Run Code Online (Sandbox Code Playgroud)

我对此感到困惑.我得到那个组1给我一个空字符串,因为它是一个懒惰的匹配.但不应该(bar)?应该贪婪,从而给我捕获组2?

似乎是合理的,我认为我应该得到的是

Array
(
    [0] => foo
    [1] => 
    [2] => bar
)
Run Code Online (Sandbox Code Playgroud)

[1]空间在哪里.然而......这不会发生.为什么?

Joh*_* H. 5

这里的答案非常简单.第一组没有任何东西(第一次传球),甚至没有空间.第二组尝试将空格与"bar"匹配,当然,这会失败.如果有什么背后的东西要匹配,引擎现在会回溯并扩展第一个捕获组以匹配空间.但它现在的状态非常好(第二组实际上可以是emtpy),所以它就是这样.

为了产生你所期望的,试试这个:

preg_replace('~foo(.*?)(bar)?_~', 'foo bar_', $m);
Run Code Online (Sandbox Code Playgroud)


在编辑中,您添加了另一个捕获组.(.*)现在是2.它匹配到字符串的结尾,正如你所想的那样.所以你就是那个,你刚刚改变了例子^^