From: loveajax@... Date: 2008-05-04T22:25:03+09:00 Subject: Re: Backreferences in case statements On May 4, 3:11 am, Robert Klemme wrote: > On 03.05.2008 18:00, lovea...@gmail.com wrote: > > > I am not sure if this is possible. I have a case statement which > > checks for a regular expression. For example: > > > case text > > when /(abc)(.)*/ > > when /(xyz)(.)*/ > > end > > > In the above snippet how can I use the instance variables pre_match > > and post_match? I tried calling these methods without any qualifiers > > but I got a NoMethodError. Where does Ruby store the MatchData if the > > matching is done in a case statement? > > $ irb > irb(main):001:0> /b/ =~ "abc" > => 1 > irb(main):002:0> $` > => "a" > irb(main):003:0> $' > => "c" > irb(main):004:0> $~ > => # > irb(main):005:0> $~.to_a > => ["b"] > irb(main):006:0> $~.pre_match > => "a" > irb(main):007:0> $~.post_match > => "c" > irb(main):008:0> > > But why do you have groups in your regular expressions if you are not > interested in the content?  Also "(.)*" seems a bit odd because it might > not yield what you expect: > > irb(main):008:0> /a(.)*/ =~ "abcdef" > => 0 > irb(main):009:0> $1 > => "f" > > IMHO it is generally a bad idea to use grouping in the way you do it > because it will capture a lot that you are not interested in.  It seems > you might rather want "(.*)". > > Kind regards > >         robert Hey Robert, In my guess /b/ =~ "abc" is what sets $~ variable. Since I am not using that statement anywhere that variable is not set at all. Instead I am doing the matching in a case statement. As a result I am not able to do something like $~.pre_match. I am not fond of $1, $2, etc variables. I feel comfortable using the instance variables pre_match and post_match. But you solved the first problem I was trying to solve :) I was using (.)* instead of (.*) and I couldn't get what I wanted. (.*) is what I needed. Thanks so much for that. Now I can use $1, $2 at least if not pre_match and post_match. -subbu