Yeah you're right,

> match =  'Today is Feb 23rd, 2003'.match(/Feb 23(rd)??/)
> match[0] #=> "Feb 23"
> match[1] #=> nil

I expected:

> match =  'Today is Feb 23rd, 2003'.match(/Feb 23(rd)?/)  #  ? is greedy here
> match[0] #=> "Feb 23rd"
> match[1] #=> nil

But what I got in ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] is:
> match[0] #=> "Feb 23rd"
> match[1] #=> 'rd'

The behavior of '?' being greedy is correct since it matched "Feb
23rd" which is stored in match[0] . But should match[1] not be nil?
The regular expression does not match "rd" alone.

thanks



On Sun, Oct 19, 2008 at 11:34 PM, Frederick Cheung
<[EMAIL PROTECTED]> wrote:
>
>
> On 19 Oct 2008, at 15:01, mars wrote:
>
>>
>> Hi!
>>
>> I couldn't understand the behavior of this code:
>>
>> match =  'Today is Feb 23rd, 2003'.match(/Feb 23(rd)?/)
>> a = match.to_a
>> puts a.size                #  2
>> puts a.join(",")           #  Feb 23rd,rd
>> puts a[0]                   #  Feb 23rd
>> puts a[1]                   #  rd
>>
>> In my understanding, /Feb 23(rd)?/ is equivalent to /Feb 23|Feb
>> 23rd/ . So, match should not include 'rd'.
>
> ? + and * are greedy, ie they always try to match as much of the
> string as possible so rd is part of the match.
> If you want a non greedy quantifier you need to add ? to it, for example
> match =  'Today is Feb 23rd, 2003'.match(/Feb 23(rd)??/)
> match[0] #=> "Feb 23"
>
> Fred
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to