ruby正则表达式扫描与=〜

Ruby(1.9.3)文档似乎暗示扫描等同于=〜,除此之外

  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”?

谢谢

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

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