http://qs321.pair.com?node_id=143016


in reply to Re: (GOLF) - multiple digit finder regex - 17 chars
in thread regexp golf - homework

/.*?([0-9]).*?\1/ *what's most interesting about this, is that $1 does not work in place of \1.
Well, of course! $1 and \1 mean different things. When $1 is used in a regex, its value is interpolated as the regex is compiled, just like any other variable. For example:
'b' =~ /(.)/; print "Yup!\n" if 'ab' =~ /(.)$1/;
prints Yup! because $1 holds 'b' from the first match and the second regex is compiled as /(.).*c/.

\1, on the other hand, is special regex syntax, and matches the same thing that was matched by the first capturing group in the current regex.

'b' =~ /(.)/; print "Yup!\n" if 'ab' =~ /(.)\1/;
does not print Yup!, because \1 wants to match an 'a'.

(\1 on the right hand side of a substitution, with the same meaning as $1, has been deprecated for quite some time.)

Update: Fixed the explanation; an earlier revision of the example used 'c' instead of 'b'.

Replies are listed 'Best First'.
Re: Re: Re: (GOLF) - multiple digit finder regex - 17 chars
by particle (Vicar) on Feb 03, 2002 at 04:39 UTC
    (\1 on the right hand side of a substitution, with the same meaning as $1, has been deprecated for quite some time.)

    yeah. that's how i was used to seeing \1. from people learning perl who are used to vi, ex, etc. on the right hand side, it's a no-no.

    although, there's a problem with the explanation of your first example. $1 can't hold 'c', it's nowhere to be found. but i understand the difference now. docs are good.

    ~Particle