2012-08-26 7 views
5

Ich habe einen regulären Ausdruck mit Capture-Gruppen, die in einem breiteren Kontext entspricht, was ich will. Ich nehme dann Aufnahmegruppe $1 und benutze es für meine Bedürfnisse. Das ist einfach.Ersetze bestimmte Capture-Gruppe anstelle der gesamten Regex in Perl

Aber wie benutze Capture-Gruppen mit s///, wenn ich nur den Inhalt von $1 ersetzen möchte, nicht die gesamte Regex, mit meinem Ersatz?

Danke!
-f

Antwort

1

Wenn Sie benötigen nur eine Aufnahme ersetzen dann mit @LAST_MATCH_START und @LAST_MATCH_END (mit use English, siehe perldoc perlvar) zusammen mit substr könnte eine praktikable Wahl sein:

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

Vielen Dank, das funktioniert! – flohei

+1

Wäre der anonyme Downvoter bitte seine Stimme erklären? Vielen Dank. –

12

Wie ich verstehe, können Sie Look-Ahead oder Look-Behind verwenden, die keine Zeichen verbrauchen. Oder speichern Sie Daten in Gruppen und entfernen Sie nur das, wonach Sie suchen. Beispiele:

Mit Vorgriff:

s/your_text(?=ahead_text)//; 

Gruppierung Daten:

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

Dies ist eine alte Frage, aber ich fand die folgenden einfacher zum Ersetzen von Zeilen, die mit >something bis >something_else beginnen. Gut zum Ändern der Header für Fasta-Sequenzen

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

    }