2012-06-11 6 views
5

私は2つの異なる文字列にマッチしたいと思います。$ 1と$ 2、 に来るはずです。この例の私によれば、$ aが 'xy abc'ならば$ 1は 'xy abc' 'abc'は必要ですが、 'abc'の部分は$ 3です。 正規表現を書くのに手伝ってください。$ 1は文字列全体を持ち、$ 2は に2番目の部分があるはずです。 私はperl 5.8.5を使用しています。perl regex matchingが失敗しました

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"; 
    } 
} 

出力:でも、全体のことをキャプチャしてわざわざなぜ

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

perl test_reg.pl 

Pattern= abc xy 

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

Pattern= xy abc 

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

"私は、Perl 5.8.5を使用しています。"それは8歳です。あなたは本当にアップグレードを検討する必要があります。 –

答えて

1

キャプチャ$2$3の一方のみを定義することができますので、あなたはより多くのキャプチャ変数を許すと一緒に暮らすことができる場合は、出力に

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

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

はで行うことができますか?これには$&を使用できます。

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

    if(/(?|abc (xy)|xy (abc))/) { 
     print "Match: \$&='$&', \$1='$1'\n"; 
    } 
} 
+0

''?| ''それは何ですか? – Cylian

+0

@cylian、 'perlre'から引用:*"これは "分岐リセット"パターンで、キャプチャグループには各交代ブランチの同じ開始点から番号が付けられます。 "* – Qtax

+0

+1それは間違いのようです!しかし、私の無知だけ! – Cylian

0

を与える

foreach my $item (@data) { 

    print "\nPattern= $item\n"; 

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

を書くことができます$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]: 
    - match: 1: [abc xy], 2: [xy] 
[xy abc]: 
    - match: 1: [xy abc], 2: [abc]
関連する問題