6

Ruby(1.9.3)文档似乎暗示 scan 等同于 =~ 除了

  1. scan 返回多个匹配项,而 =~ 仅返回第一个匹配项,并且
  2. scan 返回匹配数据,而 =~ 返回索引。

但是,在下面的示例中,这两种方法似乎为相同的字符串和表达式返回不同的结果。这是为什么?

1.9.3p0 :002 > str = "Perl and Python - the two languages"
 => "Perl and Python - the two languages" 
1.9.3p0 :008 > exp = /P(erl|ython)/
 => /P(erl|ython)/ 
1.9.3p0 :009 > str =~ exp
 => 0 
1.9.3p0 :010 > str.scan exp
 => [["erl"], ["ython"]] 

如果第一个匹配的索引为 0,是否不应该扫描返回“Perl”和“Python”而不是“erl”和“python”?

谢谢

4

1 回答 1

12

当给定一个没有捕获组的正则表达式时,scan将返回一个字符串数组,其中每个字符串代表一个正则表达式的匹配项。如果您使用scan(/P(?:erl|ython)/)(与您的正则表达式相同,除了没有捕获组),您将得到["Perl", "Python"],这是您所期望的。

但是,当给定带有捕获组的正则表达式时,scan将返回一个数组数组,其中每个子数组包含给定匹配项的捕获。因此,如果您有例如 regex (\w*):(\w*),您将获得一个数组数组,其中每个子数组包含两个字符串:冒号之前的部分和冒号之后的部分。在您的示例中,每个子数组都包含一个字符串:由(erl|ython).

于 2012-04-24T03:42:04.517 回答