Regexp multiple matches


#1

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.


#2

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!


#3

On Wed, Jan 28, 2009 at 1:26 PM, Mickael Faivre-Macon
removed_email_address@domain.invalidwrote:

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 T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain


#4

And is there a way to keep previous matching ?
Mickael.

Andrew T. wrote:

On Wed, Jan 28, 2009 at 1:26 PM, Mickael Faivre-Macon
removed_email_address@domain.invalidwrote:

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 T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain


#5

On Wed, Jan 28, 2009 at 5:00 PM, Mickael Faivre-Macon
removed_email_address@domain.invalidwrote:

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 T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain


#6

On Jan 28, 2009, at 10:00 AM, Mickael Faivre-Macon wrote:

Andrew T.
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 B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#7

Sure, that’s what I’ve just done :slight_smile:
Just wondering.
Thanks anyway.

Mickael.

Andrew T. wrote:

On Wed, Jan 28, 2009 at 5:00 PM, Mickael Faivre-Macon
removed_email_address@domain.invalidwrote:

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 T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain