bug is ruby regexp

N

Nick Black

Hello,

I spotted this problem in ruby's regexp today:

$ irb(main):001:0> num = "10"
=> "10"
irb(main):002:0> if num =~ /[9-13]/
irb(main):003:1> puts "hello"
irb(main):004:1> end
SyntaxError: compile error
(irb):2: invalid regular expression: /[9-13]/
from (irb):4
from :0
irb(main):005:0>

I have tested it in ruby 1.8 and 0.9.

Anyone else spotted this?
 
J

James Edward Gray II

Hello,

I spotted this problem in ruby's regexp today:

$ irb(main):001:0> num = "10"
=> "10"
irb(main):002:0> if num =~ /[9-13]/
irb(main):003:1> puts "hello"
irb(main):004:1> end
SyntaxError: compile error
(irb):2: invalid regular expression: /[9-13]/
from (irb):4
from :0
irb(main):005:0>

I have tested it in ruby 1.8 and 0.9.

Anyone else spotted this?

A character class ([...]) with a range of 9-1 is not valid in a
regular expression because 1 does not come after 9 in your character
encoding.

I believe you were trying to verify that num is between 9 and 13.
Your regex would not do this even if it was legal. Character classes
give multiple choices for a single character, not a group of characters.

Here are some ways to perform your check:
num = "10" => "10"
num =~ /\A(?:9|1[0123])\Z/ => 0
num.to_i.between? 9, 13
=> true

Hope that helps.

James Edward Gray II
 
R

Rob Biedenharn

Hello,

I spotted this problem in ruby's regexp today:

$ irb(main):001:0> num = "10"
=> "10"
irb(main):002:0> if num =~ /[9-13]/
irb(main):003:1> puts "hello"
irb(main):004:1> end
SyntaxError: compile error
(irb):2: invalid regular expression: /[9-13]/
from (irb):4
from :0
irb(main):005:0>

I have tested it in ruby 1.8 and 0.9.

Anyone else spotted this?

A character class ([...]) with a range of 9-1 is not valid in a
regular expression because 1 does not come after 9 in your
character encoding.

I believe you were trying to verify that num is between 9 and 13.
Your regex would not do this even if it was legal. Character
classes give multiple choices for a single character, not a group
of characters.

Here are some ways to perform your check:
num = "10" => "10"
num =~ /\A(?:9|1[0123])\Z/ => 0
num.to_i.between? 9, 13
=> true

Hope that helps.

James Edward Gray II

or with a range:
=> false

You could also have Float values=> true
=> false

Since num.to_i is 13.

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 
B

brabuhr

I spotted this problem in ruby's regexp today: ...

(irb):2: invalid regular expression: /[9-13]/
from (irb):4
from :0
irb(main):005:0>

A character class ([...]) with a range of 9-1 is not valid in a
regular expression because 1 does not come after 9 in your character
encoding.

For comparative reference:

$ perl -e 'print "foo" if 9 =~ /[9-13]/'
Invalid [] range "9-1" in regex; marked by <-- HERE in m/[9-1 <-- HERE
3]/ at -e line 1.

$ python -c "import re; re.match('[9-13]', '9')"
Traceback (most recent call last):
File "<string>", line 1, in ?
File "/usr/lib/python2.4/sre.py", line 129, in match
return _compile(pattern, flags).match(string)
File "/usr/lib/python2.4/sre.py", line 227, in _compile
raise error, v # invalid expression
sre_constants.error: bad character range
 

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

Similar Threads


Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,900
Latest member
Nell636132

Latest Threads

Top