什么';Ruby字符串上的扫描和匹配的区别是什么
我是Ruby新手,一直使用什么';Ruby字符串上的扫描和匹配的区别是什么,ruby,regex,Ruby,Regex,我是Ruby新手,一直使用String.scan搜索第一个出现的数字。返回的值在嵌套数组中有点奇怪,但我只是去[0][0]查找我想要的值。(我确信它有它的用途,只是我还没有用过。) 我刚刚发现有一个String.match方法。而且它似乎更方便,因为返回的数组不是嵌套的 以下是两个示例,第一个是扫描: >> 'a 1-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a => [["a ", "1"]] 然后是比赛 >> 'a
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
不能做到的,反之亦然。任何只有一个人才能完成的特定场景?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
将第一个匹配项作为对象返回,该对象包含由特殊变量(如$&
(正则表达式匹配的内容;映射到索引0的内容)、$1
(匹配1)、$2
)保存的数据,等人。之前的回答指出,扫描将返回调用该方法的字符串中的每个匹配项,但这是不正确的
扫描跟踪索引,并在上一个匹配的最后一个字符之后继续查找后续匹配
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 found
搜索模式包含组的部分原因是什么?因为对于简单的扫描
str.scan(/\d+/)
,它非常简单。