Reguläre Ausdrücke

Allgemeines zu regulären Ausdrücken
Aufbau eines regulären Ausdrucks
Reguläre Ausdrücke für einzelne Zeichen
Reguläre Ausdrücke für Zeichenketten




Allgemeines zu regulären Ausdrücken

Eine der nützlichsten Eigenschaften von Perl (wenn nicht die nützlichste Eigenschaft) ist das mächtige String-Handling. Und der Motor des String-Handling sind die regulären Ausdrücke zur Mustererkennung.

Reguläre Ausdrücke sind genau definierte Suchmuster für Zeichen und Zeichenketten. Mit Hilfe dieser Suchmuster können beispielsweise Variabeleninhalte durchsucht und bearbeitet. Jedem ist das Jokerzeichen * aus DOS bekannt. So ist es in DOS möglich mit dir *.exe ein Liste aller exe-Dateien eines Verzeichnisses abzurufen. Das Jokerzeichen ist hierbei ein Platzhalter für eine beliebige Anzahl beliebiger Zeichen. Reguläre Ausdrücke in Perl funktionieren ähnlich.

Aufbau eines regulären Ausdrucks

Beispiel 1:

#!/usr/bin/perl
$satz = "Hello World!";

if ($satz =~ "Hello") {
  print "'Hello' kommt im Satz '$satz' vor.\n";
} else {
  print "'Hello' kommt im Satz '$satz' nicht vor.\n";
}

Beispiel 2:

#!/usr/bin/perl
@Orte = ("Berlin","Paris","London","Madrid","Athen","Rom","Lissabon","Stockholm","Kopenhagen");

for(@Orte) {
  if(/[MKS]/) {    # Alle Orte, in denen 'M', 'K' oder 'S' vorkommt
    print "Die Stadt $_ entspricht dem Suchmuster\n";
  }
}

Erläuterung:

Einen regulären Ausdruck erkennt man in Perl normalerweise an den beiden Schrägstrichen /.../. Zwischen den Schrägstrichen steht jeweils der reguläre Ausdruck. Der Operator für die Mustererkennung ist =~. In Beispiel 1 wird überprüft ob das Muster "Hello" im String $satz vorkommt.

In Beispiel 2 wird eine Liste mit Städtenamen definiert. Innerhalb for-Schleife werden alle Listenelemente, also die Städtenamen, danach durchsucht, ob in ihnen einer der Großbuchstaben M, K oder S vorkommt. Die Suche wird mit if(/[MKS]/) formuliert. In diesem Fall wird im Gegensatz zu Beispiel 1 kein Abfrage-Operator eingesetzt, da sich die Abfrage aufgrund der Schleife immer auf das aktuelle Element der Liste bezieht.

Ein weiterer Mustererkennungsoperator Operator ist !~. Dieser Operator funktioniert genau entgegengesetzt zu =~, Man kann damit überprüfen ob ein Muster nicht in einem String enthalten ist z.B. $satz !~ "Hello". Dieser Ausdruck ist wahr, wenn das Muster "Hello" nicht im String $satz vorkommt.

Achtung:

In Perl wird beim Durchsuchen von Mustern auch zwischen Groß- und Kleinschreibung unterschieden.

Reguläre Ausdrücke für einzelne Zeichen

Die Nummerierungen der folgenden regulären Ausdrücke dienen ausschließlich der Erklärung. Sie gehören nicht zum den regulären Ausdrücken.

Beispiele:

( 1) /a/            # findet 'a'
( 2) /[ab]/         # findet 'a' oder 'b'
( 3) /[A-Z]/        # findet Grossbuchstaben
( 4) /[0-9]/        # findet Ziffern
( 5) /\d/           # findet Ziffern - genau wie ( 4)
( 6) /\D/           # findet alles ausser Ziffern
( 7) /[0-9]\-/      # findet Ziffern oder Minuszeichen
( 8) /[\[\]]/       # findet alles, worin eckige Klammern vorkommen
( 9) /[a-zA-Z0-9_]/ # findet Buchstaben, Ziffern oder Unterstrich
(10) /[\w]/         # findet Buchstaben, Ziffern oder Unterstrich - genau wie ( 9)
(11) /[\W]/         # findet alles ausser Buchstaben, Ziffern oder Unterstrich
(12) /[\r]/         # findet das Steuerzeichen für Wagenrücklauf (DOS-typisch)
(13) /[\n]/         # findet das Steuerzeichen für Zeilenvorschub
(14) /[\t]/         # findet das Steuerzeichen für Tabulator
(15) /[\f]/         # findet das Steuerzeichen für Seitenvorschub
(16) /[\s]/         # findet Leerzeichen sowie Steuerzeichen aus (12-15) 
(17) /[\S]/         # findet alles ausser Leerzeichen und Steuerzeichen aus (12-15) 
(18) /[^äöüÄÖÜ]/    # findet alles, worin keine deutschen Umlaute vorkommen
(19) /[^a-zA-Z]/    # findet alles, worin keine Buchstaben vorkommen
(20) /[ab]/s        # findet 'a' oder 'b' auch zeilenübergreifend

Erläuterung:

Um in einem regulären Ausdruck nach einzelnen Zeichen zu suchen, muss man den Suchausdruck in eckige Klammern setzten. Verwendet man keine eckigen Klammern, so wird der Suchausdruck als Zeichenkette interpretiert.

Reguläre Ausdrücke für Zeichenketten

Die Nummerierungen der folgenden regulären Ausdrücke dienen ausschließlich der Erklärung. Sie gehören nicht zum den regulären Ausdrücken.

Beispiele:

( 1) /aus/          # findet 'aus' - auch in 'Haus' oder 'Mausi'
( 2) /aus?/         # findet 'aus' usw. - aber auch 'au' und 'auf'
( 3) /a./           # findet 'ab' und 'an'
                    # (ein beliebiges Zeichen hinter 'a')
( 4) /a+/           # findet 'a' und 'aa' und 'aaaaa'
                    # (ein oder beliebig viele 'a')
( 5) /a*/           # findet 'a' und 'aa' und 'aaaaa' und 'b'
                    # (kein oder beliebig viele 'a')
( 6) /Ha.s/         # findet 'Haus' und 'Hans' aber nicht 'Hannes'
( 7) /Ha.+s/        # findet 'Haus' und 'Hans' und 'Hannes'
                    # (ein oder beliebig viele beliebige Zeichen)
( 8) /Ha.s/         # findet 'Haus' und 'Hans' aber nicht 'Hase'
( 9) /Ha.?s/        # findet 'Haus' und 'Hans' und 'Hase'
(10) /x{10,20}/     # findet zwischen 10 und 20 'x' in Folge
(11) /x{10,}/       # findet 10 und mehr 'x' in Folge
(12) /x{2}y/        # findet nur 'xxxy'
(13) /Hans\b/       # findet 'Hans' aber nicht 'Hansel'
(14) /\baus/        # findet 'aus' oder 'aussen' aber nicht 'Haus'
(15) /\baus\b/      # findet 'aus' aber nicht 'Haus' und auch nicht 'aussen'
(16) /\baus\B/      # findet 'aussen' aber nicht 'aus' und auch nicht 'Haus'
(17) /^Hans/        # findet 'Hans' nur am Anfang des zu durchsuchenden Bereichs
(18) /Hans$/        # findet 'Hans' nur am Ende des zu durchsuchenden Bereichs
(19) /^\s*$/        # findet Zeilen, die nur aus Leerzeichen und ähnlichem bestehen
(20) /$Name/        # findet den Inhalt des Skalars $Name
(21) /aus/s         # findet 'aus' auch zeilenübergreifend

Erläuterung:

Um in einem regulären Ausdruck nach einer Zeichenkette zu suchen, muss der Suchausdruck zwischen zwei Schrägstrichen stehen. Die eckigen Klammer, wie sie bei der Suche nach einzelnen Zeichen verwendet werden, fallen weg.

Die Symbole ., *, +, ? und {} haben in der Mustererkennung eine spezielle Bedeutung. Sie beziehen sich immer auf das Zeichen davor (siehe Beispiel 3 - 5).

Symbol Bedeutung
. genau ein beliebiges Zeichen
* kein mal oder beliebig oft
+

mindestens einmal

? einmal oder kein mal
{n} genau n-mal
{n,} mindestens n-mal
{n,m} mindestens n-mal, maximal m-mal

Die oben genannten Zeichen können aber nicht nur auf einzelne Zeichen angewendet werden, sondern auch auf Zeichenketten. Setzt man den Suchausdruck in runde Klammern () und dahinter eines der obigen Zeichen, so gilt die Bedeutung des Zeichen für die gesamte Zeichenkette.

Beispiel 1:

/(mar)+/       #findet marco, marmarco, mmarco, mmarmarco, markko, 
/h(al)*lo/     #findet hallo, hlo, halallo, halalallo

Auch Alternativen können in regulären Ausdrücken verwendet werden. Dazu wird der Operator | benutzt.

Beispiel 2:

/a|bc|d/       # findet 'a' oder 'bc' oder 'd'
/(a|b)(c|d)/   # findet 'ac' oder 'ad' oder 'bc' oder 'bd'

 

Index

© Markus Katzmayr, 2000 - last modified: Nov 08, 2000.