Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Ruby字符串上的扫描和匹配的区别是什么_Ruby_Regex - Fatal编程技术网

什么';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

我是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
不能做到的,反之亦然。任何只有一个人才能完成的特定场景?
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+/)
,它非常简单。