Backreferences in case statements

Hi,

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?

Thanks
-subbu

On May 3, 2008, at 10:05 AM, [email protected] wrote:

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?

$1, $2, etc.

a @ http://codeforpeople.com/

On 03.05.2008 18:00, [email protected] wrote:

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> $~
=> #MatchData:0x7ff9eb54
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

On May 4, 3:11 am, Robert K. [email protected] wrote:

In the above snippet how can I use the instance variables pre_match
=> “c”
But why do you have groups in your regular expressions if you are not
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 :slight_smile: 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

2008/5/3 [email protected]:

Where does Ruby store the MatchData if the
matching is done in a case statement?

Subbu, there’s also Regexp.last_match. Sometimes this reads better
than those Perl-like variables.

Regards,
Pit

On May 4, 5:40 am, Pit C. [email protected] wrote:

2008/5/3 [email protected]:

Where does Ruby store the MatchData if the
matching is done in a case statement?

Subbu, there’s also Regexp.last_match. Sometimes this reads better
than those Perl-like variables.

Regards,
Pit

Hi Pitt,

I did use Regexp.last_match. But its a class method. I am interested
in using something like pre_match and post_match methods which are
instance variables. But looks like my code never created the instance
of MatchData.

Thanks
-subbu

On May 4, 2008, at 8:25 AM, [email protected] wrote:

Pit

Hi Pitt,

I did use Regexp.last_match. But its a class method. I am interested
in using something like pre_match and post_match methods which are
instance variables. But looks like my code never created the instance
of MatchData.

Regexp.last_match.pre_match

James Edward G. II

Hi –

On Sun, 4 May 2008, [email protected] wrote:

On May 4, 5:40 am, Pit C. [email protected] wrote:

2008/5/3 [email protected]:

Where does Ruby store the MatchData if the
matching is done in a case statement?

Matching doesn’t change in or out of a case statement; it’s still the
same thing.

instance variables. But looks like my code never created the instance
of MatchData.

Methods aren’t instance variables; they’re methods :slight_smile:

Ruby keeps track of the last match operation performed, and that’s
what you get in $~ (which is a MatchData object) and some of the
Regexp class methods.

David

On 04.05.2008 15:21, [email protected] wrote:

and post_match? I tried calling these methods without any qualifiers
=> #MatchData:0x7ff9eb54
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 :slight_smile: 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> $~
=> #MatchData:0x100230b8
irb(main):009:0> $~.pre_match
=> “a”
irb(main):010:0> $~.post_match
=> “c”
irb(main):011:0>

robert

Hi –

On Mon, 5 May 2008, Rick DeNatale wrote:

what you get in $~ (which is a MatchData object) and some of the
Regexp class methods.

And $~ is actually a thread local global, so it holds the matchdata
produced by the last successful match on the current thread.

I’m pretty sure that Regexp.last_match is thread-safe as well.

I believe it just returns $~, so it should be identical in terms of
thread safety.

David

On Sun, May 4, 2008 at 11:22 AM, David A. Black [email protected]
wrote:

2008/5/3 [email protected]:

Where does Ruby store the MatchData if the
matching is done in a case statement?

Matching doesn’t change in or out of a case statement; it’s still the
same thing.

Ruby keeps track of the last match operation performed, and that’s
what you get in $~ (which is a MatchData object) and some of the
Regexp class methods.

And $~ is actually a thread local global, so it holds the matchdata
produced by the last successful match on the current thread.

I’m pretty sure that Regexp.last_match is thread-safe as well.


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/