Ruby Regexp:+;vs*。特殊行为?
使用ruby regexp,我得到以下结果:Ruby Regexp:+;vs*。特殊行为?,ruby,regex,Ruby,Regex,使用ruby regexp,我得到以下结果: >> 'foobar'[/o+/] => "oo" >> 'foobar'[/o*/] => "" 但是: 文档上写着: *:零次或多次重复上述内容 +:前面的一个或多个重复 所以我希望'foobar'[/o*/]返回与'foobar'[/o+/]相同的结果 有人解释过“foobar”[/o*/]与出现在f前面的位置0处的零o相匹配吗 'foobar'[/o+/]无法在那里匹配,因为至少需要有1个o,因此它与位置
>> 'foobar'[/o+/]
=> "oo"
>> 'foobar'[/o*/]
=> ""
但是:
文档上写着:*:零次或多次重复上述内容
+:前面的一个或多个重复 所以我希望'foobar'[/o*/]返回与'foobar'[/o+/]相同的结果
有人解释过“foobar”[/o*/]与出现在
f
前面的位置0处的零o
相匹配吗
'foobar'[/o+/]
无法在那里匹配,因为至少需要有1个o
,因此它与位置1的所有o
匹配
具体来说,您看到的匹配是
'foobar'[/o*/]
=>'foobar'
'foobar'[/o+/]
=>'fbar'
这是对regexp工作原理的常见误解
尽管*是贪婪的,并且没有锚定在字符串的开头,但是regexp引擎仍然会从字符串的开头开始查看。在“/o+/”的情况下,它在位置0(例如“f”)处不匹配,但由于+表示一个或多个,它必须继续匹配(这与贪婪无关),直到找到匹配项或评估所有位置
然而,对于“/o*/”的情况,正如您所知,这意味着0次或多次,当它在位置0处不匹配时,regexp引擎将在该点正常停止(应该如此,因为o*仅仅意味着o是可选的)。还有性能方面的原因,既然“o”是可选的,为什么要花更多的时间来寻找它呢
>> 'foobar'[/fo+/]
=> "foo"
>> 'foobar'[/fo*/]
=> "foo"