Ok, now for a clean and simple answer... 

The parenthesis create "groups".  Groups give you the ability to save
away parts of the matched pattern for easy access after a match has
been made. And yes, the O'Reilly book "Mastering Regular Expressions"
would be a good read it explains this concept quite completely.

When you use Regexp#match, if you find a match, you are returned a
MatchData object which provides an [] API for standard array style
access.

Element 0 ( [0] ) provides the COMPLETE match. If you defined any
groups in the regular expression, they will then appear as additional
elements in the MatchData [] array. Each group is then accessable
using ordinals ( [1] .. [9] I don't know what happens after 9, I've
never needed that many ) ... Remember that if you define a group to be
inside an optional region of the regular expression, that group will
return nil.

So, if you were parsing phone numbers in the format of: 
###-###-####

You could save yourself a bit of code and define your regex to be: 

a = "My phone number is : 800-555-1212"
b = /(\d{3})\-(\d{3})\-(\d{4})/

c = b.match( a )

if c
  puts c[0] # returns the complete match : 800-555-1212
  puts c[1] # returns group 1 : 800
  puts c[2] # returns group 2 : 555
  puts c[3] # returns group 3 : 1212
else
  puts "Not a match"
end

I hope that helps. Remember that [0] always exists, but the other
items only exist if you define groups within your regular expression.

j.

On 8/24/05, Gavin Kistner <gavin / refinery.com> wrote:
> On Aug 24, 2005, at 7:47 AM, Gavin Kistner wrote:
> > " \t\nHello".match( /^\s*(\w+)/    )  #=>  "Hello" , nil
> > " \t\nHello".match( /^(\s)*(\w+)/  )  #=>  "\n"    , "Hello"
> > " \t\nHello".match( /^(\s*)(\w+)/  )  #=>  " \t\n" , "Hello"
> > "\t   Hello".match( /^\s*(\w+)/    )  #=>  "Hello" , nil
> > "\t   Hello".match( /^(\s)*(\w+)/  )  #=>  " "     , "Hello"
> > "\t   Hello".match( /^(\s*)(\w+)/  )  #=>  "\t   " , "Hello"
> > "\n \tHello".match( /^\s*(\w+)/    )  #=>  "Hello" , nil
> > "\n \tHello".match( /^(\s)*(\w+)/  )  #=>  "\t"    , "Hello"
> > "\n \tHello".match( /^(\s*)(\w+)/  )  #=>  "\n \t" , "Hello"
> >
> 
> Three more pertinent data points:
> 
> "Hello".match( /^\s*(\w+)/    )  #=>  "Hello" , nil
> "Hello".match( /^(\s)*(\w+)/  )  #=>  nil     , "Hello"
> "Hello".match( /^(\s*)(\w+)/  )  #=>  ""      , "Hello"
> 
> 
> 


-- 
"So long, and thanks for all the fish"

Jeff Wood