# Regular Expression Grouping

**URL:** <https://www.ruby-forum.com/t/regular-expression-grouping/151279>\
**Category:** Rails\
**Created:** [October 19, 2008, 4:30pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279 "2008-10-19T16:30:48Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mdebajo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b3f665/32.png) [@mdebajo](https://www.ruby-forum.com/u/mdebajo)\
**Post date:** [October 19, 2008, 4:30pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279/1 "2008-10-19T16:30:48Z")

</div>

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’.

Thanks.

---

<div class="post-metadata">

**Author:** ![mdebajo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b3f665/32.png) [@mdebajo](https://www.ruby-forum.com/u/mdebajo)\
**Post date:** [October 19, 2008, 4:35pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279/2 "2008-10-19T16:35:29Z")

</div>

On 19 Oct 2008, at 15:01, mars wrote:

> 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

---

<div class="post-metadata">

**Author:** ![mdebajo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b3f665/32.png) [@mdebajo](https://www.ruby-forum.com/u/mdebajo)\
**Post date:** [October 19, 2008, 5:05pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279/3 "2008-10-19T17:05:59Z")

</div>

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 C.

---

<div class="post-metadata">

**Author:** ![mdebajo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b3f665/32.png) [@mdebajo](https://www.ruby-forum.com/u/mdebajo)\
**Post date:** [October 19, 2008, 5:21pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279/4 "2008-10-19T17:21:13Z")

</div>

thanks Fred. I think I misunderstood something.

On Mon, Oct 20, 2008 at 12:14 AM, Frederick C.

---

<div class="post-metadata">

**Author:** ![mdebajo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/b3f665/32.png) [@mdebajo](https://www.ruby-forum.com/u/mdebajo)\
**Post date:** [October 19, 2008, 5:15pm UTC](https://www.ruby-forum.com/t/regular-expression-grouping/151279/5 "2008-10-19T17:15:22Z")

</div>

On 19 Oct 2008, at 16:04, Marcelino Debajo wrote:

> > greedy here  
> > The regular expression does not match “rd” alone.  
> > match[1] is the first group, which in this example should be  
> > ‘rd’ (unless you’re talking about something else).

Fred
