Ruby(1.9.3)文档似乎暗示扫描等于=〜除了
但是,在以下示例中,这两个方法似乎为同一个字符串和表达式返回不同的结果。那是为什么?
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”?
由于
答案 0 :(得分:12)
当给定正则表达式而不捕获组时,scan
将返回一个字符串数组,其中每个字符串表示正则表达式的匹配项。如果您使用scan(/P(?:erl|ython)/)
(除了没有捕获群组,它与您的正则表达式相同),您将得到["Perl", "Python"]
,这正是您所期望的。
但是,当给定带有捕获组的正则表达式时,scan
将返回一个数组数组,其中每个子数组包含给定匹配的捕获。因此,如果你有例如正则表达式(\w*):(\w*)
,你将获得一个数组数组,其中每个子数组包含两个字符串:冒号前的部分和冒号后的部分。在您的示例中,每个子数组都包含一个字符串:与(erl|ython)
匹配的部分。