5

2つの異なる文字列を一致させたいので、出力は$1と$2になります。この例の私によると、$aが'xy abc'の場合、$1は'xy abc'で、$2は'abc'ですが、'abc '部分は$3で来ています。$ 1には文字列全体が含まれ、$ 2には2番目の部分が含まれる必要があるという点で、正規表現を作成するのを手伝っていただけませんか。私はperl5.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

キャプチャの1つだけを$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

$1およびよりも多くのキャプチャ変数を許可して生きることができる場合は$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 に答える