RegEx #matse只返回一个匹配项

时间:2013-10-15 05:35:06

标签: ruby regex pcre

请解释一下,为什么match()只返回一个匹配,而不是四个(例如):

s = 'aaaa'
p /a/.match(s).to_a # => ["a"]

奇怪的是,分组match()返回两个匹配,与实际匹配数无关:

s = 'aaaa'
p /(a)/.match(s).to_a # => ["a", "a"]

s = 'a aaa a'
p /(a)/.match(s).to_a # => ["a", "a"]

感谢你的回答。

2 个答案:

答案 0 :(得分:9)

您需要使用.scan()多次匹配:

p s.scan(/a/).to_a

通过分组,您可以获得一个总体匹配结果,每个组一个结果(使用.match()时。两个结果在您的正则表达式中相同。

一些例子:

> /(a)/.matc­h(s).to_a
=> ["a", "a"]           # First: Group 0 (overall match), second: Group 1
> /(a)+/.mat­ch(s).to_a­
=> ["aaaa", "a"]        # Regex matches entire string, group 1 matches the last a
> s.scan(/a/­).to_a
=> ["a", "a", "a", "a"] # Four matches, no groups
> s.scan(/(a­)/).to_a
=> [["a"], ["a"], ["a"], ["a"]] # Four matches, each containing one group
> s.scan(/(a­)+/).to_a
=> [["a"]]              # One match, the last match of group 1 is retained
> s.scan(/(a­+)(a)/).to­_a
=> [["aaa", "a"]]       # First group matches aaa, second group matches final a
> s.scan(/(a­)(a)/).to_­a
=> [["a", "a"], ["a", "a"]] # Two matches, both group participate once per match

答案 1 :(得分:3)

按功能,match只匹配一次。单个匹配对应于MatchData实例,MatchData#to_a返回一个数组,其中第0个元素是整个匹配,其他第n个元素分别是第n个捕获。捕获是()内匹配的任何内容。如果正则表达式中没有任何(),那么数组将只有整个匹配。

"a"["a", "a"]/(a)/中有多个"a"的原因是因为单个匹配除了整个匹配外还有一个捕获:第一个/(a)/表示整个匹配对应"a",第二个a代表第一个捕获,对应(a)内的scan

如果您想匹配任意多个匹配项,请使用{{1}}。