Bisweilen möchte man nicht nur nach einem bestimmten Zeichen suchen (beispielsweise den Buchstaben 'a'), sondern nach einem Zeichen, das einer Gruppe angehört (z.B. nach einem "Vokal", d.h., nach einem Buchstaben aus der Menge {a,e,i,o,u}).
Eine solche Klasse kann mit Hilfe der eckigen Klammern ("[...]
")
definiert werden. Damit wird dann im Vorgabestring nach einem Symbol aus dieser
Klasse gesucht.
#!/usr/local/bin/perl -w $t = "Computer"; if($t =~ /[aeiou]/) { print "true\n" } else { print "false\n" } # Test 1 if($t =~ /[xyz]/) { print "true\n" } else { print "false\n" } # Test 2 |
Hier liefert nur true
" ('o' aus
der Klasse [aeiou]
in 'Computer' gefunden);
die zweite Suche aber schlägt fehl (weder 'x' noch
'y' noch 'z' kommen in 'Computer' vor).
Auch in Zeichenklassen muß (wie bei einfachen Symbolen in regulären Ausdrücken) darauf geachtet werden, daß einige Zeichen eine besondere Bedeutung haben. Zusätzlich zu den weiter oben schon genannten Sonderzeichen
kommt hier noch das Minuszeichen (". ? * + ^ $ | \ ( ) [ { Klammerungssymbol
-
") hinzu. In den eckigen
Klammern verlieren zwar einige der Sonderzeichen ihre Bedeutung, dennoch sollte
man sichergehen und im Zweifelsfalle einen Backslash voranstellen.
Eine spezielle Wirkung für Zeichenklassen haben der Zirkumflex ("^
")
und das Minuszeichen ("-
"). Ersterer bedeutet (wenn er unmittelbar
nach der öffnenden Klammer ("[
") steht) soviel wie
"alle Zeichen außer ...". Das Minus wird verwendet, um eine Reihe
aufeinanderfolgender (im Sinne des ASCII-Codes) Symbole abkürzend darzustellen
(z.B. alle Kleinbuchstaben durch "[a-z]
").
#!/usr/local/bin/perl -w $t = 'Ist "1" prim ?'; if($t =~ /[0-9]/) { print "true\n" } else { print "false\n" } # Test 1 if($t =~ /[\"\']/) { print "true\n" } else { print "false\n" } # Test 2 if($t =~ /[^A-Z]/) { print "true\n" } else { print "false\n" } # Test 3 |
Die Ausgabe ist jeweils "true
". Im ersten Test wird die Zahl
1
als Mitglied der Klasse der Ziffern 0-9
erkannt.
1
(die einfachen Anführungszeichen
in der Defintion $t = ...
$t
). Im dritten Test schließlich wird das 's'
gefunden, da es das erste Zeichen ist, das nicht zur Klasse der Großbuchstaben
gehört.
Für einige oft verwendete Zeichenklassen gibt es abkürzende Schreibweisen:
(zur Erinnerung:
Zeichen Entsprechung Bedeutung \d
[0-9]
Ziffer \D
[^0-9]
Gegenstück zu \d
\w
[a-zA-Z_0-9]
alphanumerisches Zeichen \W
[^a-zA-Z_0-9]
Gegenstück zu \w
\s
[ \t\n\f\r]
Leerzeichen \S
[^ \t\n\f\r]
Gegenstück zu \s
\t
, \n
, \f
und \r
stehen für Tabulator, neue Zeile, Zeilenvorschub bzw.
Wagenrücklauf.)
Diese Abkürzungen können wiederum in Klassen verwendet werden.
Ein Sonderfall ist das Zeichen "\b
", das innerhalb einer Klasse
für einen Rückschritt (backspace) steht. Außerhalb einer
Zeichenklasse besitzt "\b
" aber eine völlig andere Bedeutung, wie
wir später sehen werden.
#!/usr/local/bin/perl -w $t = 'Eine Zahl: -3.6209'; if($t =~ /[-\d.]/) { print "true\n" } else { print "false\n" } |
Die Klasse "[-\d.]
" veranlaßt die Suche nach dem ersten
Auftreten eines der Symbole aus der Menge {-,0,1,2,3,4,5,6,7,8,9,.} (hier
wird das Minuszeichen zuerst gefunden).
Anmerkungen: Das
Minuszeichen besitzt hier keine Sonderbedeutung (wie in "[a-z]
"),
da es am Anfang der Klasse steht. Beim Punkt kann in Zeichenklassen auf das
Voranstellen eines Backslashes verzichtet werden.
Selbstverständlich können einfache Zeichensuche und Zeichenklassen in regulären Ausdrücken miteinander kombiniert werden. Beispiel: Suche nach einem Teilstring, der eine Perl-Version beschreibt.
#!/usr/local/bin/perl -w $t = 'Hier ist Perl 5.002 installiert.'; if($t =~ /Perl [1-5]\.\d\d\d/) { print "true\n" } else { print "false\n" } |
Autor: Eike Grote | Letzte Änderung: 18.02.1999 |