2012-06-11 13 views
5

मैं दो अलग-अलग स्ट्रिंग से मिलान करना चाहता हूं और आउटपुट $ 1 और $ 2, में आना चाहिए इस उदाहरण में मेरे अनुसार, यदि $ a 'xy abc' है, तो $ 1 'xy abc' और $ 2 होना चाहिए 'abc' होना चाहिए, लेकिन 'abc' भाग $ 3 में आ रहा है। क्या आप कृपया मुझे $ 1 में रेगेक्स लिखने में मदद कर सकते हैं, जिसमें पूरी स्ट्रिंग होनी चाहिए और $ 2 को का दूसरा भाग होना चाहिए। मैं perl 5.8.5 का उपयोग कर रहा हूँ।perl regex मिलान

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

वह आठ साल का है। आपको वास्तव में उन्नयन पर विचार करना चाहिए। –

उत्तर

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

आउटपुट: "। मैं पर्ल 5.8.5 का उपयोग कर रहा"

[abc xy]: 
    - match: 1: [abc xy], 2: [xy] 
[xy abc]: 
    - match: 1: [xy abc], 2: [abc]