On Feb 2, 2007, at 11:03 AM, James Edward Gray II wrote:

> On Feb 2, 2007, at 9:54 AM, Nick Black wrote:
>
>> 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:

 >> num = "10"
=> "10"
 >> (9..13) === num.to_i
=> true
 >> num = "14"
=> "14"
 >> (9..13) === num.to_i
=> false

You could also have Float values
 >> num = "11.4"
=> "11.4"
 >> (9..13) === num.to_i
=> true
 >> (9..13) === num.to_f
=> true

 >> num = "13.1"
=> "13.1"
 >> (9..13) === num.to_i
=> true
 >> (9..13) === num.to_f
=> false

Since num.to_i is 13.

-Rob

Rob Biedenharn		http://agileconsultingllc.com
Rob / AgileConsultingLLC.com