5

4 つではなく 1 つの一致のみを返す理由を説明してくださいmatch()(たとえば):

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

match()グループ化すると、実際の一致数とは関係なく、2 つの一致が返されるのは奇妙です。

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

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

あなたの答えに感謝します。

4

2 に答える 2

11

.scan()複数回一致させるために使用する必要があります。

p s.scan(/a/).to_a

また、グループ化を使用すると、一致全体に対して 1 つの結果が得られ、グループごとに 1 つの結果が得られます ( を使用する場合.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
于 2013-10-15T05:37:12.457 に答える
3

機能により、match一度だけ一致します。単一の一致はMatchDataインスタンスに対応しMatchData#to_a、0 番目の要素が一致全体であり、他の n 番目の要素がそれぞれ n 番目のキャプチャである配列を返します。キャプチャは、内部で一致するもの()です。()正規表現に何もない場合、配列には完全な一致のみが含まれます。

複数の"a"with["a", "a"]がある理由は、/(a)/1 つの一致が全体の一致に加えてキャプチャを持って"a"いるためです。/(a)/"a"a(a)

任意の数の一致に一致させたい場合は、 を使用しますscan

于 2013-10-15T05:41:47.053 に答える