Forum: Ruby regexp multiple matches

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2f6686bd2c6bb633a1cbf7b5a73c8491?d=identicon&s=25 Mickael Faivre-Macon (micktaiwan)
on 2009-01-28 12:29
Hi,

/(\d+),(\d+)(;(\d+),(\d+))*/

This regexp matches are:
0: (5,1;5,7;3,2)
1: (5)
2: (1)
3: (;3,2)
4: (3)
5: (2)

My question is why ;5,7 is not matched ?

Thanks,
Mickael.
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 David A. Black (Guest)
on 2009-01-28 13:08
(Received via mailing list)
Hi --

On Wed, 28 Jan 2009, Mickael Faivre-Macon wrote:

> 5: (2)
>
> My question is why ;5,7 is not matched ?

What's the string?


David

--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

http://www.wishsight.com => Independent, social wishlist management!
5772c599ccab3081e0fffb1d54f3b6de?d=identicon&s=25 Andrew Timberlake (andrewtimberlake)
on 2009-01-28 13:29
(Received via mailing list)
On Wed, Jan 28, 2009 at 1:26 PM, Mickael Faivre-Macon
<faivrem@gmail.com>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 '*'

--
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
2f6686bd2c6bb633a1cbf7b5a73c8491?d=identicon&s=25 Mickael Faivre-Macon (micktaiwan)
on 2009-01-28 16:03
And is there a way to keep previous matching ?
Mickael.


Andrew Timberlake wrote:
> On Wed, Jan 28, 2009 at 1:26 PM, Mickael Faivre-Macon
> <faivrem@gmail.com>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 '*'
>
> --
> Andrew Timberlake
> http://ramblingsonrails.com
> http://www.linkedin.com/in/andrewtimberlake
>
> "I have never let my schooling interfere with my education" - Mark Twain
5772c599ccab3081e0fffb1d54f3b6de?d=identicon&s=25 Andrew Timberlake (andrewtimberlake)
on 2009-01-28 17:20
(Received via mailing list)
On Wed, Jan 28, 2009 at 5:00 PM, Mickael Faivre-Macon
<faivrem@gmail.com>wrote:

> >> My question is why ;5,7 is not matched ?
> > which
> Posted via http://www.ruby-forum.com/.
>
>
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
2f6686bd2c6bb633a1cbf7b5a73c8491?d=identicon&s=25 Mickael Faivre-Macon (micktaiwan)
on 2009-01-28 17:26
Sure, that's what I've just done :)
Just wondering.
Thanks anyway.

Mickael.

Andrew Timberlake wrote:
> On Wed, Jan 28, 2009 at 5:00 PM, Mickael Faivre-Macon
> <faivrem@gmail.com>wrote:
>
>> >> My question is why ;5,7 is not matched ?
>> > which
>> Posted via http://www.ruby-forum.com/.
>>
>>
> 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
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-01-28 17:57
(Received via mailing list)
On Jan 28, 2009, at 10:00 AM, Mickael Faivre-Macon wrote:

>>> --
>>
>> 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
This topic is locked and can not be replied to.