I was helping a coworker with some regular expressions, and I realized he didn't understand several of the nuances of s///g. So I thought I would write out a few examples. For fun, I gave Tye a quiz to see if he could determine (without Perl) what the value of $_ would be after each regex. He aced it. (Of course.) Can you do the same?
For each regex, $_ starts out with '1234*5678'.
s/(.\d)\d/$1/g; | |
s/(.\d)\d+/$1/g; | |
s/(.\d)\d\d?/$1/g; | |
s/(?<=.)(\d)\d/$1/g; | |
s/(?<=\d)(\d)./$1/g; | |
s/(?<=\d)(\d)\d/$1/g; | |
s/(?<=\D)(\d)\d/$1/g; | |
s/(?<!^)\d+(\d)/$1/g; |
Here is some code to help you check your answers:
By the way, Tye isn't sure that all the cases are as obvious as one might think. In fact, we are pretty sure that some of the behavior demonstrated is undocumented. Enjoy!#!perl use strict; my $nums = "1234*5678"; my @regexes = ( q/(.\d)\d/, q/(.\d)\d+/, q/(.\d)\d\d?/, q/(?<=.)(\d)\d/, q/(?<=\d)(\d)./, q/(?<=\d)(\d)\d/, q/(?<=\D)(\d)\d/, q/(?<!^)\d+(\d)/, ); $^A = ""; for my $regex ( @regexes ) { my $target = $nums; $target =~ s/$regex/$1/g; formline "\$_ = '$nums'; \@<<<<<<<<<<<<<<<<<<<<<<< ". "# Result: \$_ eq '$target'\n", "s/$regex/\$1/g;"; print $^A; $^A = ""; }
|
---|
Replies are listed 'Best First'. | |
---|---|
(MeowChow) Re: RegEx Challenge
by MeowChow (Vicar) on May 04, 2002 at 02:14 UTC | |
Re: RegEx Challenge
by japhy (Canon) on May 03, 2002 at 21:18 UTC | |
by Adam (Vicar) on May 03, 2002 at 21:20 UTC | |
by japhy (Canon) on May 03, 2002 at 21:46 UTC |
Back to
Meditations