Reguläre Ausdrücke in Perl (1)

## Suche nach bestimmten Zeichen

Wir fangen mit dem einfachsten Beispiel an: Die Suche nach einem bestimmten Zeichen:

    #!/usr/local/bin/perl -w

    $t = "Demo-Zeichenkette";

    if($t =~ /e/) { print "true\n" } else { print "false\n" }

Hier ist der reguläre Ausdruck nur der Buchstabe "`e`" und der Operator "`=~`" veranlaßt eine Suche nach diesem Zeichen in dem String `$t`. Diese Suche beginnt immer am Anfang einer Zeichenkette, so daß sie schon beim zweiten Zeichen erfolgreich ist ('Demo-Zeichenkette'); die Ausgabe des Programms ist also "`true`".

Anstelle eines Zeichens können auch beliebig viele gesetzt werden - gesucht wird dann nach dieser Folge von Zeichen:

    #!/usr/local/bin/perl -w

    if("Leder"  =~ /ede/) { print "true\n" } else { print "false\n" }  # Test 1
    if("Eder"   =~ /ede/) { print "true\n" } else { print "false\n" }  # Test 2
    if("Gerade" =~ /ede/) { print "true\n" } else { print "false\n" }  # Test 3

Dieses Skript liefert nur in dem ersten Test "`true`", ansonsten immer "`false`", da der reguläre Ausdruck `ede` genau passen muß. D.h., es wird hier auf Groß-/Kleinschreibung geachtet (Test 2) und der Ausdruck muß so wie er definiert ist in der Zeichenkette auftreten - es genügt nicht, daß die Buchstaben `e`, `d` und `e` irgendwo im durchsuchten String stehen (Test 3).

Zu beachten ist, daß nicht nach jedem Zeichen einfach gesucht werden kann wie im obigen Beispiel, da einige in regulären Ausdrücken besondere Bedeutung haben. Es handelt sich dabei um

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

sowie um das Zeichen, das als "Klammer" um den regulären Ausdruck verwendet wird (meistens der Schrägstrich "`/`"). Will man nach diesen Symbolen suchen, so muß man einen Backslash ("`\`") voranstellen:

    #!/usr/local/bin/perl -w

    if("1...3"    =~ /\.\./)    { print "true\n" } else { print "false\n" }  # Test 1
    if("/usr/bin" =~ /\/usr\//) { print "true\n" } else { print "false\n" }  # Test 2
    if("/usr/bin" =~ m#/usr/#)  { print "true\n" } else { print "false\n" }  # Test 3
    if('??\$'     =~ /\\\$/)    { print "true\n" } else { print "false\n" }  # Test 4

Diese Tests liefern alle "`true`". Wie man beim Vergleich von Test 2 und Test 3 sieht, ist es beim Testen von UNIX-Pfadnamen oft sinnvoll, die Schrägstrich-Klammerung zu ersetzen, um allzuviele Backslashes zu vermeiden. Man beachte im Test 4 noch die einfachen Anführungsstriche, die verhindern, daß im String aus `\$` ein einfaches `$` wird.

Für einige häufig gebrauchte Zeichen, die sich schlecht direkt darstellen lassen, gibt es besondere Symbole:

> Zeichen | Bedeutung
> --- | ---
> `\n` | neue Zeile
> `\r` | Wagenrücklauf
> `\f` | Seitenvorschub
> `\t` | Tabulator
> `\a` | Signalton
> `\e` | Escape

Außerdem lassen sich auch alle Zeichen durch ihren ASCII-Code (in oktaler Darstellung) schreiben, indem man dem 3-stelligen Code einen Backslash voranstellt (so ist beispielweise "`\101`" äquivalent zum Buchstaben "`A`"). Anmerkung: es müssen immer drei Ziffern sein - also notfalls vorne mit einer oder zwei Nullen auffüllen.

Eine ganz besondere Bedeutung hat in regulären Ausdrücken der Punkt "`.`": er steht für jedes beliebige Zeichen (mit Ausnahme des newline "`\n`" - es sei denn, man verwendet bei dem regulären Ausdruck die single line-Option s).

    #!/usr/local/bin/perl -w

    $t = "1.Spalte\t2.Spalte";       # mit Tabulator \t

    if($t =~ /e\t2/)  { print "true\n" } else { print "false\n" }  # Test 1
    if($t =~ /\t\t/)  { print "true\n" } else { print "false\n" }  # Test 2
    if($t =~ /p...e/) { print "true\n" } else { print "false\n" }  # Test 3

Test 1 ergibt "`true`", da die Suche in der Mitte von `$t` erfolgreich ist. Test 2 dagegen liefert "`false`" (keine zwei aufeinanderfolgenen Tabulatoren in `$t`). Test 3 wiederum verläuft erfolgreich - er findet einen zum regulären Ausdruck passenden Substring ('1.Spalte\t2.Spalte').

Autor: Eike Grote | Letzte Änderung: 03.11.2004