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