2012-06-11 155 views
5

我想匹配兩個不同的字符串,輸出應該在$ 1和$ 2, 根據我在這個例子中,如果$ a是'xy abc',那麼$ 1應該是'xy abc'和$ 2應該'abc',但是'abc'部分的價格是3美元。 你能幫我寫一個正則表達式,$ 1應該有整個字符串,$ 2應該有 有第二部分。 我使用的是perl 5.8.5。perl正則表達式匹配失敗

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。」那已經八歲了。你應該考慮升級。 –

回答

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< 
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

如果你能允許超過捕獲變量住$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]