From: Robert Klemme Date: 2008-05-05T04:10:01+09:00 Subject: Re: Backreferences in case statements On 04.05.2008 15:21, loveajax@gmail.com wrote: > 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 "(.*)". > In my guess /b/ =~ "abc" is what sets $~ variable. Since I am not > using that statement anywhere that variable is not set at all. That's complete nonsense. Did you try it out? I guess not. Come on, don't be so lazy. > 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. pre_match and post_match are not instance variables but methods of class MatchData. > 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. irb(main):007:0> /b/ === "abc" => true irb(main):008:0> $~ => # irb(main):009:0> $~.pre_match => "a" irb(main):010:0> $~.post_match => "c" irb(main):011:0> robert