Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

perl regex matching failed

Tags:

regex

perl

I want to match two different string and output should come in $1 and $2, According to me in this example, if $a is 'xy abc', then $1 should be 'xy abc' and $2 should 'abc', but 'abc' part is coming in $3. Can you please help me to writing a regex in that $1 should have whole string and $2 should have second part. I am using perl 5.8.5.

my @data=('abc xy','xy abc');
foreach my $a ( @data) {
    print "\nPattern= $a\n";
    if($a=~/(abc (xy)|xy (abc))/) {
        print "\nMatch: \$1>$1< \$2>$2< \$3>$3<\n";
    }
}

Output:

perl test_reg.pl

Pattern= abc xy

Match: $1>abc xy< $2>xy< $3><

Pattern= xy abc

Match: $1>xy abc< $2>< $3>abc<
like image 291
user87005 Avatar asked Jun 11 '12 09:06

user87005


1 Answers

Can be done with:

(?|(abc (xy))|(xy (abc)))

Why even bother with capturing the whole thing? You can use $& for that.

my @data = ('abc xy', 'xy abc');
for(@data) {
    print "String: '$_'\n";

    if(/(?|abc (xy)|xy (abc))/) {
        print "Match: \$&='$&', \$1='$1'\n";
    }
}
like image 124
Qtax Avatar answered Oct 25 '22 03:10

Qtax