Mike Mike - 1 month ago 7
Ruby Question

Why is my expression matching somethign that clearly doesn't meet the expression?

I'm using Rails 4.2.7. I want to match the pattern, numbers, an arbitrary number of spaces, and a potential "+" at the end. So I wrote

2.3.0 :013 > /\d+\s*\+?/.match("40+")
=> #<MatchData "40+">


However, this is also matching

2.3.0 :012 > /\d+\s*\+?/.match("40-50")
=> #<MatchData "40">


What gives? The string "40-50" doesn't match the expression provided, but clearly I'm not doing something right in my regex. Any help is appreciated, -

Answer

If you want it to match only the full string, use the \A and \z markers. Like this:

/\A\d+\s*\+\z$/.match("40-50")

This will force the regular expression to match only if the full string match it.

Otherwise, the way you have it now, it will stop as soon as it find a match anywhere in your string.

\d+ means one digit or more.

\s* means an optionnal space.

\+? means an optionnal + sign

So 40 does match those conditions.

Comments