Ruby Regexp:+ vs *。特殊行为?

时间:2010-03-24 12:54:07

标签: ruby regex

使用ruby regexp我得到以下结果:

>> 'foobar'[/o+/]
=> "oo"
>> 'foobar'[/o*/]
=> ""

可是:

>> 'foobar'[/fo+/]
=> "foo"
>> 'foobar'[/fo*/]
=> "foo"

文件说:
*:前面的重复零次或多次 +:前一个

的一次或多次重复

所以我希望'foobar'[/ o * /]返回与'foobar'相同的结果[/ o + /]

是否有人对此有解释

2 个答案:

答案 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”是可选的,为什么要花更多的时间来寻找呢?

相关问题