From: Rob Biedenharn Date: 2009-01-29T01:54:13+09:00 Subject: Re: regexp multiple matches On Jan 28, 2009, at 10:00 AM, Mickael Faivre-Macon wrote: > Andrew Timberlake wrote: >> On Wed, Jan 28, 2009 at 1:26 PM, Mickael Faivre-Macon >> wrote: >> >>> 5: (2) >>> >>> My question is why ;5,7 is not matched ? >>> >>> Thanks, >>> Mickael. >>> -- >>> Posted via http://www.ruby-forum.com/. >>> >>> >> Mickael >> >> Because it matches ;5,7 first and then overwrites $3,$4 & $5 with ; >> 3,2 >> which >> matches based on the '*' >> >> >> >> What about tackling it from a completely different angle >> >> s = "5,1;5,7;3,2" >> pairs = s.split(';') #=> ["5,1", "5,7", "3,2"] >> pairs.each do |pair| >> pair.split(',') #=> ["5", "1"] etc >> end >> >> -- >> Andrew Timberlake >> http://ramblingsonrails.com >> http://www.linkedin.com/in/andrewtimberlake >> >> "I have never let my schooling interfere with my education" - Mark >> Twain >> > > And is there a way to keep previous matching ? > Mickael. > > -- irb> re = /(\d+),(\d+)(;(\d+),(\d+))*/ => /(\d+),(\d+)(;(\d+),(\d+))*/ irb> s = "5,1;5,7;3,2" => "5,1;5,7;3,2" irb> s.match(re).captures => ["5", "1", ";3,2", "3", "2"] You can wrap another set of parentheses in there: irb> re = /(\d+),(\d+)((;(\d+),(\d+))*)/ => /(\d+),(\d+)((;(\d+),(\d+))*)/ irb> s.match(re).captures => ["5", "1", ";5,7;3,2", ";3,2", "3", "2"] But in addition to Andrew's split, you could use String#scan irb> s.scan(/(\d+),(\d+)/) => [["5", "1"], ["5", "7"], ["3", "2"]] It all depends on what you're trying to accomplish. -Rob Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com