我是Ruby的新手,并且一直习惯于String.scan搜索第一次出现的数字.返回值是嵌套数组有点奇怪,但我只想[0][0]找到我想要的值.(我确信它有它的目的,只是我还没用过它.)
我刚刚发现有一种String.match方法.它似乎更方便,因为返回的数组不是嵌套的.
这是两个例子,首先是扫描:
>> 'a 1-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
=> [["a ", "1"]]
Run Code Online (Sandbox Code Playgroud)
那就是匹配
>> 'a 1-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
=> ["a 1-night", "a ", "1"]
Run Code Online (Sandbox Code Playgroud)
我检查了API,但我无法区分差异,因为两者都提到了"匹配模式".
这个问题仅仅是出于好奇,关于什么scan可以做到这一点match不能,反之亦然.任何只有一个人可以完成的特定场景?是match劣等的scan?
Jon*_*ian 54
简答: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"]
Run Code Online (Sandbox Code Playgroud)
以前的答案指出 scan 将返回调用该方法的字符串中的每个匹配项,但这是不正确的
字符串类的 scan 方法迭代字符串并返回非重叠匹配
string = 'xoxoxo'
p string.scan('xo') # => ['xo' 'xo' 'xo' ]
# so far so good but...
p string.scan('xox') # => ['xox']
# if this retured EVERY instance of 'xox' it would include a substring
# starting at indices 0 and 2 but only one match is returned
Run Code Online (Sandbox Code Playgroud)