Regexp problem

A

Albert Schlef

I want to extract an "id" parameter from the URL. I use the following
code:

url = "http://example.com/id=12345"
id = url[ /(?<=id=)(\d+)/ ]
puts id

But I get a SyntaxError telling me "undefined (?...) sequence".

Why?
 
T

The Higgs bozo

Albert said:
I want to extract an "id" parameter from the URL. I use the following
code:

url = "http://example.com/id=12345"
id = url[ /(?<=id=)(\d+)/ ]
puts id

But I get a SyntaxError telling me "undefined (?...) sequence".

Why?

Because ruby 1.8 does not have look-behind. 1.9 has it, and your code
runs on 1.9.

If you need 1.8 with look-behind, I guess you can compile 1.8 with the
Oniguruma regexp engine (which is used in 1.9).
 
R

Robert Klemme

2009/3/10 The Higgs bozo said:
Albert said:
I want to extract an "id" parameter from the URL. I use the following
code:

=A0 url =3D "http://example.com/id=3D12345"
=A0 id =3D url[ /(?<=3Did=3D)(\d+)/ ]
=A0 puts id

But I get a SyntaxError telling me "undefined (?...) sequence".

Why?

Because ruby 1.8 does not have look-behind. =A01.9 has it, and your code
runs on 1.9.

If you need 1.8 with look-behind, I guess you can compile 1.8 with the
Oniguruma regexp engine (which is used in 1.9).

Lookbehind is not needed:

09:35:18 ~$ irb
Ruby version 1.8.7
irb(main):001:0> url =3D "http://example.com/id=3D12345"
=3D> "http://example.com/id=3D12345"
irb(main):002:0> id =3D url[/id=3D(\d+)/, 1]
=3D> "12345"

Depending on what else should be done with the url a more appropriate
tool might be class URI

irb(main):006:0> require 'uri'
=3D> true
irb(main):007:0> u2 =3D URI.parse url
=3D> #<URI::HTTP:0x7ff186bc URL:http://example.com/id=3D12345>
irb(main):008:0> u2.path
=3D> "/id=3D12345"
irb(main):009:0> u2.path[/id=3D(\d+)/, 1]
=3D> "12345"

Kind regards

robert

--=20
remember.guy do |as, often| as.you_can - without end
 
A

Albert Schlef

Thanks for the info, Higgs.

Robert said:
Lookbehind is not needed: [snip]
irb(main):002:0> id = url[/id=(\d+)/, 1]
=> "12345"

Cool! I once knew of the second parameter. Thanks for reminding me of
it.

I wish I could use RI (too slooouuuw on my system) or Fast-RI (I have
it, but at one point it decided to start throwing exceptions).
 
A

Albert Schlef

Albert said:
I wish I could use RI (too slooouuuw on my system) or Fast-RI (I have
it, but at one point it decided to start throwing exceptions).

Oops. It started *raising* exceptions. Everybody knows that in Ruby you
don't *throw* exceptions ;-)
 
T

Tom Cloyd

Albert said:
I want to extract an "id" parameter from the URL. I use the following
code:

url = "http://example.com/id=12345"
id = url[ /(?<=id=)(\d+)/ ]
puts id

But I get a SyntaxError telling me "undefined (?...) sequence".

Why?
I've lately been making excellent use of the MatchData class, so here's
my solution:

irb(main):012:0> m = /\d+/.match("http://example.com/id=12345")
=> #<MatchData "12345">
irb(main):013:0> m[0]
=> "12345"

In other situations, some of the various class methods can be useful:

irb(main):014:0> m.pre_match
=> "http://example.com/id="
irb(main):015:0>

There's a #post_match method also...and more.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,176
Messages
2,570,950
Members
47,503
Latest member
supremedee

Latest Threads

Top