Ich möchte in einem String mehrere Muster durch etwas anderes ersetzen. Beispiel: aabbccddeebbddhh Ersatz: bbcc => bb bbdd => jj Ergebnis: aabbddeejjhh Beide Ersetzungen sollen zum tragen kommen. Aber sie sollen sich gegenseitig ausschliessen. D.h. entsteht, wie in dem Beispiel beim Ersatz ein Muster das wiederrum ersetzt werden "könnte", so soll es trotzdem nicht ersetzt werden. Soweit, so gut. In perl, c etc. ist das kein Problem wenn einfach ein Buffer mit der längsten Länge gelesen und mit den Mustern verglichen wird. Wenn ein Ersatz vorgenommen wurde, dann wird der Buffer um die Zeichen die ersetzt wurden weitergeschaltet. Aber geht das auch in perl regexps? Ich kann ja mit s/bbcc/bb/ nur einzelne Muster erkennen und ersetzen. Aber wenn ich zwei solche Ersetzungen hintereinanderschalte, dann ersetzt er mir vielleicht was, was (gemäß obiger Forderung) nicht mehr ersetzt werden soll. Also z.B. aabbccddeebbddhh s/bbcc/bb/ aabbddeebbddhh s/bbdd/jj/ aajjeejjhh # so nicht! Frage also, geht das anders mit regexps?
Du kannst im Replacement-Part der Regexp einfach einen Hash-Lookup machen und so beide Ersetzungen "gleichzeitig" ausführen. Zum Bleistift:
1 | my $a="aabbccddeebbddhh"; |
2 | my %replacement=(bbcc=>'bb',bbdd=>'jj'); |
3 | $a=~s/(bbcc|bbdd)/$replacement{$1}/g; |
4 | print $a; |
Ergibt: aabbddeejjhh Wird so ähnlich oft beim HTML-Escaping angewandt, damit "<" zu "<" und eben nicht "&lt;" wird:
1 | my %html_escape = ('&' => '&', '>'=>'>', '<'=>'<', '"'=>'"'); |
2 | my $html_escape = qr/([&<>"])/; |
3 | |
4 | sub basic_html_escape |
5 | { |
6 | return unless defined ${ $_[0] }; |
7 | |
8 | ${ $_[0] } =~ s/$html_escape/$html_escape{$1}/mg; |
9 | } |
@ Ernst Ich muss schon sagen. Danke.
Dieses "&lt;" ist mir aber schon öfter untergekommen. Na ja. Vielleicht liest einer diesen Thread. ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.