我以为我在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"
答案 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"]
但我仍然希望找到更简单的答案......