Ruby(1.9.3)文档似乎暗示扫描等效于=〜,除了

  • 扫描返回多个匹配项,而=〜仅返回第一个匹配项,而
  • 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将返回一个数组数组,其中每个子数组都包含给定匹配项的捕获。因此,例如,如果有regex (\w*):(\w*),则会得到一个数组数组,其中每个子数组都包含两个字符串:冒号之前的部分和冒号之后的部分。在您的示例中,每个子数组都包含一个字符串:与(erl|ython)匹配的部分。

    09-28 07:56