Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Why is regexp "\Amax_repeats=(\d+)" not equal to "^max_repeats=([0-9]+)" ?

Reply
Thread Tools

Why is regexp "\Amax_repeats=(\d+)" not equal to "^max_repeats=([0-9]+)" ?

 
 
Martin Elzen
Guest
Posts: n/a
 
      04-30-2004

Hi everyone.

I'm trying to learn how to program in Ruby, and yesterday I came across a
Regexp issue I can't figure out. I want to parse a commandline argument of
the form: max_repeats=<integer>

After studying the 'pick-axe' book, I came up with the line:
regexp = Regexp.new("\Amax_repeats=(\d+)")

but the above regexp fails to match with correct input. When I changed that
line to the following:
regexp = Regexp.new("^max_repeats=([0-9]+)")

it *does* match correctly with the proper input.

What I would like to know is, why doesn't the first Regexp work? (FWIW, I'm
using Ruby 1.8.1 on Win2003 server.)

Sincerely,
Martin

PS a complete program with my regexp matching code is as follows:

#define globals

$max_repeat_count_default = 5




def get_max_repeats_value
result = $max_repeat_count_default

if not ARGV.empty?

#regexp = Regexp.new("\Amax_repeats=(\d+)")
#@@@
regexp = Regexp.new("^max_repeats=([0-9]+)")

matchdata = candidate_val = match_val = nil

ARGV.each do |arg|
matchdata = regexp.match(arg)

if matchdata != nil
match_val = matchdata[1].to_i

if candidate_val == nil
candidate_val = match_val
else
candidate_val = match_val if match_val > candidate_val
end

end

end

result = candidate_val if candidate_val != nil and candidate_val > 0

end

result
end



begin
max_repeats = get_max_repeats_value
puts "max_repeats=" + max_repeats.to_s

rescue Exception => ex
print "Exception exception: " + ex.message +
",\nbacktrace:\n" + ex.backtrace.join("\n")

end

__________________________________________________ _______________
Hotmail en Messenger on the move
http://www.msn.nl/communicatie/smsdi.../hotmailsmsv2/



 
Reply With Quote
 
 
 
 
Simon Strandgaard
Guest
Posts: n/a
 
      04-30-2004
"Martin Elzen" <(E-Mail Removed)> wrote:
> I'm trying to learn how to program in Ruby, and yesterday I came across a
> Regexp issue I can't figure out. I want to parse a commandline argument of
> the form: max_repeats=<integer>
>
> After studying the 'pick-axe' book, I came up with the line:
> regexp = Regexp.new("\Amax_repeats=(\d+)")
>
> but the above regexp fails to match with correct input. When I changed that
> line to the following:
> regexp = Regexp.new("^max_repeats=([0-9]+)")
>
> it *does* match correctly with the proper input.
>


Watch out about escaping inside double quoted strings..
observe the difference

irb(main):001:0> re = Regexp.new("\Ax")
=> /Ax/
irb(main):002:0> re.match("xxx").to_a
=> []
irb(main):003:0> re = Regexp.new('\Ax')
=> /\Ax/
irb(main):004:0> re.match("xxx").to_a
=> ["x"]
irb(main):005:0>


Does this help you ?

--
Simon Strandgaard


 
Reply With Quote
 
 
 
 
ts
Guest
Posts: n/a
 
      04-30-2004
>>>>> "M" == Martin Elzen <(E-Mail Removed)> writes:

M> regexp = Regexp.new("\Amax_repeats=(\d+)")
^^ ^^

You want \\ rather than \

svg% ruby -e 'p Regexp.new("\Amax_repeats=(\d+)")'
/Amax_repeats=(d+)/
svg%

svg% ruby -e 'p Regexp.new("\\Amax_repeats=(\\d+)")'
/\Amax_repeats=(\d+)/
svg%

ou use simple quote, i.e. ''


Guy Decoux


 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      04-30-2004

"Martin Elzen" <(E-Mail Removed)> schrieb im Newsbeitrag
news:(E-Mail Removed)...
>
> Hi everyone.
>
> I'm trying to learn how to program in Ruby, and yesterday I came across

a
> Regexp issue I can't figure out. I want to parse a commandline argument

of
> the form: max_repeats=<integer>
>
> After studying the 'pick-axe' book, I came up with the line:
> regexp = Regexp.new("\Amax_repeats=(\d+)")


You're running into a quoting issue here. See the subtle differences:

irb(main):003:0> Regexp.new("\Amax_repeats=(\d+)")
=> /Amax_repeats=(d+)/
irb(main):004:0> Regexp.new("\\Amax_repeats=(\\d+)")
=> /\Amax_repeats=(\d+)/
irb(main):005:0> %r(\Amax_repeats=(\d+))
=> /\Amax_repeats=(\d+)/
irb(main):006:0> /\Amax_repeats=(\d+)/
=> /\Amax_repeats=(\d+)/
irb(main):007:0> Regexp.new('\Amax_repeats=(\d+)')
=> /\Amax_repeats=(\d+)/

Your code (the first line) looses the backslash ("\") because it is the
escape char in the double quoted string. You can use single quoted string
(last line) but in this case I'd prefer any of the other methods since the
string is constant anyway.

> but the above regexp fails to match with correct input. When I changed

that
> line to the following:
> regexp = Regexp.new("^max_repeats=([0-9]+)")
>
> it *does* match correctly with the proper input.
>
> What I would like to know is, why doesn't the first Regexp work? (FWIW,

I'm
> using Ruby 1.8.1 on Win2003 server.)


As said, the regexps are not near to identical. Your expression really
starts with an uppercase "a" where you wanted it to start with "\A" which
is the "start of string" anchor.

Kind regards

robert


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Newbie: Are Ruby regexp's a subset, superset, or equal to Perl's? Harry Ruby 12 09-23-2009 09:45 PM
[regexp] How to convert string "/regexp/i" to /regexp/i - ? Joao Silva Ruby 16 08-21-2009 05:52 PM
Internet Sharing: Equal upload speeds but un-equal download speeds =?Utf-8?B?TkpU?= Wireless Networking 3 09-15-2007 06:22 AM
why why why why why Mr. SweatyFinger ASP .Net 4 12-21-2006 01:15 PM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM



Advertisments