Schrift
[thread]8429[/thread]

+?.*^$()[]{}|\ ersetzen durch andere Zeichenkette



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Gast Gast
 2006-10-18 16:41
#70902 #70902
Hi,

ich lese aus einer Datei verschiedene Dinge ein.

Nun kommen in den Zeilen folgende Zeichen des öfteren vor:
+?.*^$()[]{}|\ (man nennt sie auch Reservierte Zeichen)

Ich möchte nun, wenn eines der obigen Zeichen in meiner eingelesenen Zeile vorkommt, das jeweilige Zeichen durch \ und das jeweilige Zeichen ersetzt wird.
Bsp.:
| ersetzen durch \|
[ ersetzen durch \[
usw.

Leider komme ich da einfach nicht weiter.
Könnte mir jemand den Code sagen wie ich meine Zeile auf die Zeichen hin überprüfe und wenn eines der Zeichen auftritt, ich dieses wie oben beschrieben ersetzen kann??
Vielen Dank im voraus!
Kalmuecke
renee
 2006-10-18 16:47
#70903 #70903
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
my $string = q~+?.*^$()[]{}|\\~;
$text =~ s/([\Q$string\E])/\\$1/g;
print $text;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-10-18 17:20
#70904 #70904
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Bei renees Version wird der String nicht verändert. Allerdings werden die Zeichen richtig escaped.

Wenn du die Zeichen direkt im Originalstring escapen möchtest, z.B. weil du den String nicht unbedingt in einer Regex verwenden möchtest, dann kannst du auch "quotemeta" benutzen.

Code: (dl )
1
2
3
my $string = '+?.*^$()[]{}|\\';
$string = quotemeta $string;
print $string;
\n\n

<!--EDIT|sid burn|1161177657-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Kalmuecke
 2006-10-18 18:06
#70905 #70905
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Und wendet Perl nun eure Code-Beispiele auch nur an, wenn tatsächlich eines der Zeichen vorkommt?
Sprich wird automatisch geprüft und bei Bedarf ersetzt, ansonsten bleibt es so wie es ist??
nepos
 2006-10-18 18:25
#70906 #70906
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Die Loesung mit quotemeta wuerde alle Zeichen ausser A-Z, a-z, 0-9 und _ mit einem Backslash versehen. Eventuell also mehr, als du eigentlich willst. Steht auch in der Doku.
Kalmuecke
 2006-10-18 18:31
#70907 #70907
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
[quote=sid burn,18.10.2006, 15:20]Bei renees Version wird der String nicht verändert. Allerdings werden die Zeichen richtig escaped.[/quote]
Dann würde mich interessieren wie renees Version auszusehen hat, wenn auch tatsächlich nach der Überprüfung, daß ein solches Zeichen in meiner Zeile enthalten ist, dieses auch ensprechend ersetzt wird!?!?!?
pq
 2006-10-18 18:34
#70908 #70908
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Kalmuecke,18.10.2006, 16:06]Und wendet Perl nun eure Code-Beispiele auch nur an, wenn tatsächlich eines der Zeichen vorkommt?
Sprich wird automatisch geprüft und bei Bedarf ersetzt, ansonsten bleibt es so wie es ist??[/quote]
wie bitteschön soll perl ein zeichen ersetzen, das nicht vorkommt?
du kannst natürlich auch erst mit einem match m// prüfen und dann
s/// anwenden, aber zu welchem zweck, außer alles doppelt so langsam
zu machen?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
sid burn
 2006-10-18 21:53
#70909 #70909
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Kalmuecke,18.Oct..2006, 16:31][quote=sid burn,18.10.2006, 15:20]Bei renees Version wird der String nicht verändert. Allerdings werden die Zeichen richtig escaped.[/quote]
Dann würde mich interessieren wie renees Version auszusehen hat, wenn auch tatsächlich nach der Überprüfung, daß ein solches Zeichen in meiner Zeile enthalten ist, dieses auch ensprechend ersetzt wird!?!?!?[/quote]
Mal eine Gegenfrage, was willst du den überhaupt erreichen? Also warum möchtest du die Zeichen escapen?

Einzelne bestimmte Zeichen könntest du auch mit einer Substitution ersetzen:
Code: (dl )
$string =~ s~([$%&])~\\$1~g


Allerdings ist die Frage nach dem Sinn wichtig. Wenn du den String in einer Regex verwenden möchtest, dann benutze die Methode von Renne, wenn du einfach alles auser a-Z, A-Z, 0-9 und _ ersetzen möchtest dann benutze quotemeta.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-10-18 22:24
#70910 #70910
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Kalmuecke,18.10.2006, 16:31][quote=sid burn,18.10.2006, 15:20]Bei renees Version wird der String nicht verändert. Allerdings werden die Zeichen richtig escaped.[/quote]
Dann würde mich interessieren wie renees Version auszusehen hat, wenn auch tatsächlich nach der Überprüfung, daß ein solches Zeichen in meiner Zeile enthalten ist, dieses auch ensprechend ersetzt wird!?!?!?[/quote]
hast Du meinen Code denn mal laufen lassen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Kalmuecke
 2006-10-19 13:36
#70911 #70911
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Quote
Mal eine Gegenfrage, was willst du den überhaupt erreichen? Also warum möchtest du die Zeichen escapen?


Ich lese verschiedene Dinge aus einer Config-Datei aus, die dann mit dem Inhalt einer anderen Datei verglichen werden! Und mir ist dabei aufgefallen, wenn eben diese Sonderzeichen in der Config-Datei vorkommen, daß dann der Vergleich mit dem Inhalt der zweiten Datei nicht funktioniert. Setze ich aber diese "Sonderzeichen" in der Configfile mit dem "\" voran, dann funktioniert es. Deshalb wollte ich gerne beim Einlesen der Config-Datei alle diese Sonderzeichen mit dem "\" versehen!

Quote
hast Du meinen Code denn mal laufen lassen?

Nein ich habe es noch nicht getestet, werde es aber gleich tun!
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-10-18 16:41.