Ruby字符串扫描和匹配有什么区别

问题描述:

我是Ruby的新手,并且总是使用String.scan来搜索数字的第一个匹配项。这很奇怪,返回的值是嵌套数组,但我只是去[0][0]为我想要的值。 (我相信它有它的目的,只是我还没有使用它。)Ruby字符串扫描和匹配有什么区别

我刚刚发现有一个String.match方法。它似乎更方便,因为返回的数组不是嵌套的。

下面是两个例子,第一个是扫描:

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

然后是比赛

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

我检查API,但我真的不能区分差异,如两者都被称为'匹配模式'。

这个问题是,只是出于好奇,关于什么scan可以做,match不能,反之亦然。任何只有一个人能完成的具体情景?是match劣质scan

简答:scan将返回所有匹配项。这不会使它更好,因为如果你只想要第一场比赛,str.match[2]str.scan[0][1]好得多。

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

#scan返回正则表达式匹配的所有内容。

#match返回第一匹配作为MatchData对象,其中包含由像$&特殊变量保持的数据(什么是由正则表达式匹配;这是什么是映射到索引为0),$1(匹配1),$2,等。