Klammern erkennen in REGEX
|
Seitenanfang |
Ich habe schon immer Probleme gehabt, wenn Klammern erkannt werden sollten. Ein Beispiel von heute: Ich hatte eine Wortliste, nach ABC geordnet, allerdings mit Zeilen dazwischen, die ich nicht haben wollte. Meine Idee war, die Zeilen herauszufischen, die nicht mit einem bestimmten Buchstaben beginnen. Dazu hatte ich in der Ausgangsdateien jeweils Markierungen angebracht: #a aber ?§ieieo<jkj> Auto #b ... Das Programm ging dann so: [code] if($line=~ /#(.)/){ $anfangsbuchstabe = $1; next; } if($line =~ /^$anfangsbuchstabe/){ print HIER "$line\n"; }else{ print DA "$line\n"; }OK, das lief soweit ganz gut. Jetzt aber das Problem: Im Ausgangstext gab es auch solche Zeilen: (ein) Auto (eine) Frau jksdrfjlsd(;= (ein) Ei entsprechend habe ich hier es so markiert: #( (ein) Auto ... Wenn das Programm an die erste runde Klammer kommt, bekomme ich eine Meldung, dass die Klammer nicht matchen würde und bricht ab. Perl sieht das als Metazeichen an, nicht als Literal. Wie gehe ich mit solchen Klammern um? (In meiner Not habe ich bisher diese Troublemaker einfach ersetzt durch etwas anderes, aber das ist nicht so elegant). Vielen Dank im Voraus Felix
Datum: 21.07.2005-17:16

|
re: Klammern erkennen in REGEX
|
Seitenanfang |
| Hi, Klammern müssen mit Backslashes abgeschaltet werden, damit sie als Suchbegriff erkannt werden.
my $var =~ s/^(.*) \((.*)\) \((.*)\)$/$1 $2 $3/;
Aus
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050517 Firefox/1.0.4 (Debian package 1.0.4-2)
wird dann
Mozilla/5.0 X11; U; Linux i686; en-US; rv:1.7.8 Gecko/20050517 Firefox/1.0.4 Debian package 1.0.4-2
-uw
Datum: 21.07.2005-17:31

|
re: Klammern erkennen in REGEX
|
Seitenanfang |
| Vielen Dank für die Antwort. Um aus Metazeichen Literale zu machen nimmt man Backslashes - OK. Allerdings habe ich das Problem zunächst nicht innerhalb der Regex, sondern mit Klammern, die in der Ausgangsdatei sind. Perl erkennt die erste Klammer in der Ausgangsdatei und tut dann so, als stünde die Klammer in der Regex ... obwohl sie das ja eigentlich NICHT tut.
Datum: 21.07.2005-17:49

|
re: Klammern erkennen in REGEX
|
Seitenanfang |
| OK, dann solltest Du den Inhalt der/s Variable/Arrays, in die/den die Datei eingelesen wurde, erst auf Klammern untersuchen und ihnen ein Backslash voranstellen.
my $tmp = "Pius (I.)"; $tmp =~s/([\(\)])/\\$1/g;
Aus "Pius (I.)" wird dann "Pius \(I.\))".-uw
Datum: 21.07.2005-23:25

|
Nachtrag
|
Seitenanfang |
| Sorry, eine Klammer zu viel. Aus "Pius (I.)" wird dann natürlich "Pius \(I.\)".
Datum: 21.07.2005-23:27

|
re: Nachtrag
|
Seitenanfang |
Klingt nicht schlecht - ich werde es mal ausprobieren. Ich melde dann nochmal zurück, wie es gegangen ist. Allerdings kann ich das erst wieder ab Montag. Vielen Dank bis dahin erstmal.Felix
Datum: 22.07.2005-07:50

|