Login
Newsletter
Werbung

Mi, 6. Oktober 1999, 00:00

Perl/CGI-Workshop, Teil 14

Perl/CGI-Workshop, Teil 14.

Nochmal reguläre Ausdrücke

Wir haben Regexps in früheren Kapiteln als ein extrem mächtiges Sprachmittel kennengelernt. Manchmal genügen allerdings die bisher vorgestellten Möglichkeiten nicht.

Wenn Sie wissen wollen, was ein Operator gematched hat, verwenden Sie Klammern und die Variablen $1, $2, $3...:

#!/usr/bin/perl -w
# greedy.pl -- by W. Jährling
$a = "aCVHGzBVHJTRz";
if ($a =~ /a(.*)z/) {
 print $1;
}

Der "Inhalt" der ersten Klammer steht in $1, der der zweiten in $2 usw. Bei verschachtelten Klammern bekommt die zuerst geöffnete (also äußere) Klammer die niedrigere Nummer.

Von sich aus sind alle Operatoren in regulären Ausdrücken erstmal "greedy", also gierig. Das bedeutet, dass sie versuchen, so viele Zeichen wie möglich zu "verschlingen". Das ist nicht immer gewünscht. Umkehren kann man diese "Voreinstellung", indem man dem betroffenen Operator ein "?" nachstellt:

#!/usr/bin/perl -w
# non-greedy.pl -- by W. Jährling
$a = "aCVHGzBVHJTRz";
if ($a =~ /a(.*?)z/) {
 print $1;
}

Die Variablen $1, $2 etc. kann man bei Ersetzungs-Operationen auf der rechten Seite verwenden:

#!/usr/bin/perl -w
# re-use.pl -- by W. Jährling
$a = "210012100111002100101";
$a =~ s/1(.)1/$1$1$1/g; # Wenn etwas zwischen zwei Einsen
 # steht, werden die Einsen in diese
 # Zahl umgewandelt.

Für die ersten 9 geklammerten Ausdrücke kann man auch \1 bis \9 verwenden, wie es z.B. bei den regulären Ausdrücken in vi gehandhabt wird. VORSICHT: Die Notation \1 ist nur innerhalb eines regulären Ausdrucks gültig, in "normalem" Perl-Code ist sie nicht erlaubt.

Bereits kennengelernt haben wir die "Anker" ^ und $, die für Anfang und Ende eines Strings standen, aber durch die kein einziges echtes Zeichen gematched wurde. Es gibt noch einen weiteren Anker, der oft auch nützlich sein kann: Der Word-Boundary-Anker (\b), der für den Rand eines Wortes steht. Bei e.\b muss z.B. der vorletzte Buchstabe eines Wortes ein "e" sein.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung