Ruby的“hello world”.scan(/(\ w){2} /)与“hello world”.scan(/ \ w {2} /)不同?

时间:2010-11-06 13:14:20

标签: ruby regex

我以为我在Ruby中知道scan:好像它正在做一个匹配,但是为所有结果重复它并放入数组?

ruby-1.9.2-p0 > "hello world".scan(/\w{2}/)
 => ["he", "ll", "wo", "rl"] 

ruby-1.9.2-p0 > "hello world".scan(/(\w){2}/)
 => [["e"], ["l"], ["o"], ["l"]] 

第二行是如何产生的 - 你如何让它返回与第1行相同的结果? (因为有时我们必须将()添加到正则表达式。


作为合同,无论是否有(),以下内容都是相同的:

ruby-1.9.2-p0 > "hello world"[/\w{2}/]
 => "he" 

ruby-1.9.2-p0 > "hello world"[/(\w){2}/]
 => "he" 

2 个答案:

答案 0 :(得分:3)

parens创建一个匹配组。请改为/(?:\w){2}/

答案 1 :(得分:0)

我发现了更多内容:

如果有的话,

scan似乎可以使用组,所以这就是第二行的行为就是这样的原因。 (使用( )中的最后匹配内容,并在数组内的结果中使用它。)

作为测试:(如果有多个组,则所有组都进入一个数组)

ruby-1.9.2-p0 > "hello world".scan(/((\w){2})/)
 => [["he", "e"], ["ll", "l"], ["wo", "o"], ["rl", "l"]] 

这是获取它的一种方法:总是添加顶级( ),并使用map来获取数组中的第一个元素(即顶级匹配):

ruby-1.9.2-p0 > "hello world".scan(/((\w){2})/).map {|e| e.first}
 => ["he", "ll", "wo", "rl"]

但我仍然希望找到更简单的答案......