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

lul*_*ala 44 ruby regex

我是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)


unr*_*ity 22

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

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


Eri*_*ers 9

以前的答案指出 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)