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
,等。