5

我想匹配两个不同的字符串,输出应该是 $1 和 $2,根据我在这个例子中,如果 $a 是 'xy abc',那么 $1 应该是 'xy abc' 而 $2 应该是 'abc',但是 'abc ' 部分售价为 3 美元。你能帮我写一个正则表达式,$1 应该有整个字符串,$2 应该有第二部分。我正在使用 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";
    }
}

输出:

perl test_reg.pl

Pattern= abc xy

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

Pattern= xy abc

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

3 回答 3

4

可以通过以下方式完成:

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

为什么还要费心捕捉整件事呢?你可以使用$&它。

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

    if(/(?|abc (xy)|xy (abc))/) {
        print "Match: \$&='$&', \$1='$1'\n";
    }
}
于 2012-06-11T09:57:58.320 回答
1

因为只有一个 captures$2$3可以定义,所以可以写

foreach my $item ( @data) {

  print "\nPattern= $item\n";

  if ($item=~/(abc (xy)|xy (abc))/) {
    printf "Match: whole>%s< part>%s<\n", $1, $2 || $3;
  }
}

这给出了输出

Pattern= abc xy
Match: whole>abc xy< part>xy<

Pattern= xy abc
Match: whole>xy abc< part>abc<
于 2012-06-11T11:25:58.320 回答
0

如果您可以接受比$1and更多的捕获变量$2,则使用匹配的替代分支中的子字符串。

for ('abc xy', 'xy abc') {
  print "[$_]:\n";

  if (/(abc (xy))|(xy (abc))/) {
    print "  - match: ", defined $1 ? "1: [$1], 2: [$2]\n"
                                    : "1: [$3], 2: [$4]\n";
  }
  else {
    print "  - no match\n";
  }
}

输出:

[abc xy]:
  - 匹配:1:[abc xy],2:[xy]
[xy abc]:
  - 匹配:1:[xy abc],2:[abc]
于 2012-06-11T13:23:52.127 回答