2012-06-11 31 views
5

Tôi muốn khớp hai chuỗi và đầu ra khác nhau phải có $ 1 và $ 2, Theo tôi trong ví dụ này, nếu $ a là 'xy abc', thì $ 1 phải là 'xy abc' và $ 2 nên 'abc', nhưng phần 'abc' sẽ có giá $ 3. Bạn có thể vui lòng giúp tôi viết một regex trong đó $ 1 nên có toàn bộ chuỗi và $ 2 nên có phần thứ hai. Tôi đang sử dụng perl 5.8.5.Kết hợp regex perl không thành công

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

Đó là tám tuổi. Bạn thực sự nên xem xét nâng cấp. –

Trả lời

1

Bởi vì chỉ có một trong những ảnh chụp $2$3 có thể được xác định, bạn có thể viết

foreach my $item (@data) { 

    print "\nPattern= $item\n"; 

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

mang đến cho đầu ra

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

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

có thể được thực hiện với:

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

Tại sao ngay cả bận tâm với chụp toàn bộ điều? Bạn có thể sử dụng $& cho điều đó.

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

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

''? | '' Đó là gì? – Cylian

+0

@Cylian, được trích dẫn từ 'perlre': *" Đây là mẫu "đặt lại nhánh", có đặc tính đặc biệt mà các nhóm chụp được đánh số từ cùng một điểm bắt đầu trong mỗi nhánh thay đổi. "* – Qtax

+0

+1, Đầu tiên có vẻ như một lỗi! Nhưng không có gì ngoài sự thiếu hiểu biết của tôi! – Cylian

0

Nếu bạn có thể sống với phép biến chụp hơn $1$2, sau đó sử dụng các chất nền từ nhánh thay thế phù hợp.

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

Output: "Tôi đang sử dụng perl 5.8.5"

[abc xy]: 
    - match: 1: [abc xy], 2: [xy] 
[xy abc]: 
    - match: 1: [xy abc], 2: [abc]
Các vấn đề liên quan