Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Regexp:+;vs*。特殊行为?_Ruby_Regex - Fatal编程技术网

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

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,因此它与位置

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

>> '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"