Reguläre Ausdrücke (2)

## Klassen von Zeichen

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 Test 1 "`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

>      . ? * + ^ $ | \ ( ) [ { Klammerungssymbol

kommt hier noch das Minuszeichen ("`-`") 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. Test 2 ist erfolgreich beim ersten Auftreten von doppelten Anführungszeichen vor der `1` (die einfachen Anführungszeichen in der Defintion `$t = ...` gehören ja nicht zu `$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:

> 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`

(zur Erinnerung: `\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: 03.11.2004