Regex - in einem bestimmten Bereich suchen und strings ersetzen

GustlPC

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
343
Hallo,

ich erstelle gerade einen kleinen Editor für meine Webseite (Scriptsprache Perl).
Nun muss ich aus einer Zeichenkette in einem bestimmten Bereich alle string die zb so aussehen "BR" ersetzten, durch "YY".

Folgender Zeichenkette:
BC BR BD POINT_A DN HN JN BR NK BR POINT_E BR NH BR CJ POINT_A MK NE BR BD BR POINT_E BR BD

Zwischen POINT_A und POINT_B sollen also alle strings "BR" durch "YY" ersetzt werden, quasi die hier fett dargestellten. Die kursiven sollen aber so bleiben. und genau da ist mein Problem. :(

1. Ansatz:
Code:
$content =~ s/(BR)/YY/g;
2. Ansatz:
Code:
$content =~ s/POINT_A(BR)POINT_E/YY/g;

Im ersten werden alle ersetzt. Und im zweiten Ansatz ersetzt er dann alles zwischen den points mit inhalt...
Weiß wer wo ich da ansetzten muss? Wäre super.

Gruß
 
Bin ja nicht der krasse regexp experte, aber koenntest es ja mal auf mehrere regexps aufteilen ... erst mal die Bereiche zwischen den Points matchen und in ne variable zurueckgeben und dann nur dort substituten ... danach das ganze wieder zum ganzen zusammensetzen ... sicher kein cooler 1337 regexp code, aber sollte ja irgendwie machbar sein.

Sowas wie dein zweites Beispiel duerfte eigentlich nicht funktionieren, da schon das Mtching wegen Greed die Maximaldistanz zwischen punkt A und E matchen wuerde.
 
Zuletzt bearbeitet:
In deinem Beispiel würde ich es wie voon machen und aufteilen -> bearbeiten -> zusammenfügen, aber man will ja auch mal tiefer in die Materie einsteigen und was lernen.



Wenn du genau weisst, dass zwischen POINT_A und POINT_E zweimal BR vorkommt, dann funktioniert:
Code:
s/(POINT_A)(.*?)BR(.*?)BR(.*?)(POINT_E)/$1$2YY$3YY$4$5/g;
Falls du die genaue Anzahl nicht weisst, dann lässt du einfach x-mal diese Zeile drüberlaufen:
Code:
s/(POINT_A)(.*?)BR(.*?)(POINT_E)/$1$2YY$3$4/g;
x wäre in deinem Fall die maximale Anzahl an BRs, die du zwischen zwei POINTs erwartest. Zuviele Durchläufe schaden nicht.
 
Mit dem "e"-Modifikator geht's:

Code:
$s=~ s/POINT_A(.*?)POINT_E/ my $a= $1; $a=~ s#BR#YY#g; "POINT_A" . $a . "POINT_E" /ge;


HTH

BigNum
 
Zuletzt bearbeitet:
Zurück
Oben