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

gg58donl  于 9个月前  发布在  Ruby
关注(0)|答案(3)|浏览(80)

我是Ruby新手,一直使用String.scan来搜索第一个出现的数字。返回值是嵌套数组,这有点奇怪,但我只是去[0][0]寻找我想要的值。(我相信它有它的用途,只是我还没有使用它。)
我刚刚发现有一个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不能做什么,反之亦然。任何只有一个能完成的特定场景?matchscan差吗?

yyyllmsg

yyyllmsg1#

简短的回答: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"]

字符串

ttisahbt

ttisahbt2#

#scan返回Regex匹配的所有内容。
#match将第一个匹配作为MatchData对象返回,其中包含由特殊变量保存的数据,如$&(Regex匹配的内容;Map到索引0的内容),$1(匹配1),$2等。

waxmsbnn

waxmsbnn3#

以前的答案指出,扫描将返回从字符串中调用方法的每个匹配,但这是不正确的
string类的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

字符串

相关问题