String#scan puzzlement

I'm trying to match sequences of capitalised words - can someone
explain why the second regexp works but not the first?

irb(main):001:0> a = "And then we Went to The Next Place to be"
=> "And then we Went to The Next Place to be"
irb(main):002:0> a.scan /([A-Z]\w+\s+)+/
=> [["And "], ["Went "], ["Place "]]
irb(main):003:0> a.scan /(?:[A-Z]\w+\s+)+/
=> ["And ", "Went ", "The Next Place "]

martin

Martin DeMello wrote:

I'm trying to match sequences of capitalised words - can someone
explain why the second regexp works but not the first?

irb(main):001:0> a = "And then we Went to The Next Place to be"
=> "And then we Went to The Next Place to be"
irb(main):002:0> a.scan /([A-Z]\w+\s+)+/
=> [["And "], ["Went "], ["Place "]]
irb(main):003:0> a.scan /(?:[A-Z]\w+\s+)+/
=> ["And ", "Went ", "The Next Place "]

Because when you group, scan returns arrays with [$1, $2, $3...], etc., but in "to The Next Place to be" =~ /([A-Z]\w+\s+)+/ there is only $1. Put the last "+" inside a group.

···

--

ah! that makes things a lot clearer, thanks.

martin

···

On 7/12/06, Carlos <angus@quovadis.com.ar> wrote:

Martin DeMello wrote:
> I'm trying to match sequences of capitalised words - can someone
> explain why the second regexp works but not the first?
>
> irb(main):001:0> a = "And then we Went to The Next Place to be"
> => "And then we Went to The Next Place to be"
> irb(main):002:0> a.scan /([A-Z]\w+\s+)+/
> => [["And "], ["Went "], ["Place "]]
> irb(main):003:0> a.scan /(?:[A-Z]\w+\s+)+/
> => ["And ", "Went ", "The Next Place "]

Because when you group, scan returns arrays with [$1, $2, $3...], etc.,
but in "to The Next Place to be" =~ /([A-Z]\w+\s+)+/ there is only $1.
Put the last "+" inside a group.