2012-08-26 21 views
5

में पूरे रेगेक्स के बजाय विशिष्ट कैप्चर समूह को बदलें, मुझे कैप्चर समूह के साथ नियमित अभिव्यक्ति मिली है जो व्यापक संदर्भ में जो चाहता है उससे मेल खाता है। मैं फिर कैप्चर समूह $1 लेता हूं और अपनी आवश्यकताओं के लिए इसका उपयोग करता हूं। यह आसान है।पर्ल

लेकिन s/// के साथ कैप्चर समूहों का उपयोग कैसे करें जब मैं सिर्फ $1 की सामग्री को प्रतिस्थापित करना चाहता हूं, न कि पूरे प्रतिस्थापन, मेरे प्रतिस्थापन के साथ?

धन्यवाद!
-f

उत्तर

1

आप केवल एक पर कब्जा को बदलने के लिए की जरूरत है तो @LAST_MATCH_START और @LAST_MATCH_END का उपयोग कर (use English साथ; perldoc perlvar देखें) के साथ मिलकर substr एक व्यवहार्य विकल्प हो सकता है:

use English qw(-no_match_vars); 
$your_string =~ m/aaa (bbb) ccc/; 
substr $your_string, $LAST_MATCH_START[1], $LAST_MATCH_END[1] - $LAST_MATCH_START[1], "new content"; 
# replaces "bbb" with "new content" 
+0

धन्यवाद, यह काम करता है! – flohei

+1

अज्ञात डाउनवॉटर होगा कृपया उसका वोट समझाएं? धन्यवाद। –

12

जैसा कि मैं समझता हूं, आप आगे बढ़ने या पीछे की ओर उपयोग कर सकते हैं जो वर्णों का उपभोग नहीं करते हैं। या समूहों में डेटा को सहेजें और केवल वही हटाएं जो आप खोज रहे हैं। उदाहरण:

देखो आगे के साथ

:

s/your_text(?=ahead_text)//; 

समूहन डेटा:

s/(your_text)(ahead_text)/$2/; 
1

यह एक पुराना सवाल है, लेकिन मुझे >something से >something_else से शुरू होने वाली रेखाओं को बदलने के लिए नीचे दिया गया आसान पाया गया। फास्टा अनुक्रमों के लिए हेडर बदलने के लिए अच्छा

while ($filelines=~ />(.*)\s/g){ 
     unless ($1 =~ /else/i){ 
       $filelines =~ s/($1)/$1\_else/; 
     } 

    }