使用ruby regexp我得到以下结果:
>> 'foobar'[/o+/]
=> "oo"
>> 'foobar'[/o*/]
=> ""
可是:
>> 'foobar'[/fo+/]
=> "foo"
>> 'foobar'[/fo*/]
=> "foo"
文件说:
*:前面的重复零次或多次
+:前一个
所以我希望'foobar'[/ o * /]返回与'foobar'相同的结果[/ o + /]
是否有人对此有解释
答案 0 :(得分:14)
'foobar'[/o*/]
与o
之前{0}}位置的零f
相匹配
'foobar'[/o+/]
无法匹配,因为至少需要1 o
,因此它会匹配位置1中的所有o
具体来说,您看到的比赛是
'foobar'[/o*/]
=>
'<>foobar'
'foobar'[/o+/]
=>
'f<oo>bar'
答案 1 :(得分:3)
这是对正则表达式如何运作的常见误解。
虽然*是贪婪的并且没有锚定在字符串的开头,但正则表达式引擎仍将从字符串的开头开始查找。在“/ o + /”的情况下,它在位置0处不匹配(例如“f”),但由于+表示一个或多个,它必须继续匹配(这与贪婪无关),直到找到匹配或评估所有职位。
然而,对于“/ o * /”的情况,如你所知,它意味着0次或更多次,当它在位置0处不匹配时,正则表达式引擎将在该点正常停止(因为它应该,因为o *仅表示o是可选的)。还有性能原因,因为“o”是可选的,为什么要花更多的时间来寻找呢?