George
1/23/2007 8:44:00 AM
On 1/23/07, Martin Kahlert <mkcon@gmx.de> wrote:
> Hi ruby experts!
>
> Is this intended behaviour?
>
> irb(main):001:0> s1='a=1'
> => "a=1"
> irb(main):002:0> s2='b=1'
> => "b=1"
Call this part 1:
> irb(main):003:0> s1 =~ /a|b=(.)/
> => 0 <------ expression matches
> irb(main):004:0> $1
> => nil <------ but where is argument?
Part 2:
> irb(main):005:0> s2 =~ /a|b=(.)/
> => 0 <------ expression matches
> irb(main):006:0> $1
> => "1" <------ this has been expected
Part 3:
> irb(main):007:0> s1 =~ /(a|b)=(.)/
> => 0 <------ expression matches
> irb(main):012:0> $2
> => "1" <------ this has been expected
I'm not sure why you think it might be a bug. The '|' operator just
binds very loosely, so you have to group the "a|b" in parens. Note
that in part 1, The bit that matches is the left side of the '|',
namely 'a' (no parens), so there are no captures. In part 2, the
right side ('b=(.)') matches, so there's 1 capture. In part 3, it
matches the whole thing ('(a|b)=(.)'), so there are 2 captures.
Does this make sense?
Note that if you only want 1 capture, you can also use the shy
grouping operator (?:...), so:
s1 =~ /(?:a|b)=(.)/
[$1, $2] #=> ["1", nil]