Matthias Raithel

Reguläre Ausdrücke

Einleitung
Reguläre Audrücke sind eine sehr elegante und effiziente Weise in Zeichenketten nach bestimmten Mustern zu suchen, bzw. diese zu ersetzen. Anwendung finden sie in verschiedenen Programmiersprachen oder auch in Editoren wie vim.
Grundsätzliches
Der reguläre Ausdruck besteht aus den sog. Metazeichen([, ], (, ), {, }, |, ?, +, *, ^, $, \, .) und normalen Buchstaben. Der reguläre Ausdruck steht immer zwischen zwei / auf die ich der Einfachheit halber im Folgenden verzichten werde.
Metazeichen und Kombinationen
. Jedes beliebige Zeichen.
[abc] Eines der Zeichen in den eckigen Klammern muss vorkommen, also "a", "b" oder "c".
[1-5A-Z] Der Bindestrich gibt an, dass es sich um einen Bereich handelt. Es muss also eine Zahl zwischen 1 und 5 oder ein Buchstabe von A bis Z vorkommen.
[^a] "^" negiert den AUsdruck, es muss also ein beliebiges Zeichen außer "a" vorkommen.
Vordefinierte Zeichenklassen
(werden nicht von jeder implementation unterstützt)
\d Jede beliebige Ziffer (entspricht [0-9])
\D Keine Ziffer (entspricht [^0-9])
\w Ein Buchstabe, eine Zahl oder der Unterstrich (entspricht [a-zA-Z_0-9])
\W Kein Buchstabe, keine Zahl und kein Unterstrich (entspricht [^\w])
\s Whitespace (entspricht meistens [\f\n\r\t\v])
\S keine Whitespace (entspricht [^\s])
Quantoren
(geben die Anzahl des vorherigen Ausdrucks an)
{n} Der vorherige Ausdruck kommt exakt n mal vor.
{n,} Der vorherige Ausdruck kommt mindestens n mal vor.
{,n} Der vorherige Ausdruck kommt höchstens n mal vor.
{n,m} Der vorherige Ausdruck kommt mindestens n und höchstens m mal vor.
? Der vorherige Ausdruck kommt 0 oder 1 mal vor. (entspricht {0,1})
+ Der vorherige Ausdruck kommt mindestens einmal vor. (entspricht {1,})
* Der vorherige Ausdruck kommt beliebig oft vor (auch kein mal). (entspricht {0,})
Zu beachten ist hier, dass z.B. [0-9]{1,5} auf eine Reihe aus 1 bis 5 beliebigen Ziffern (z.B. 1231) passt und nicht nur auf eine einzige sich wiederholende Ziffer (z.B. 2222) zutrifft.
Gieriges Verhalten
Der Parser wählt normalerweise immer die größtmögliche Zeichenkette, die auf den Ausdruck passt aus (gieriges Verhalten). Da dies oft nicht erwünscht ist können in neueren Implementierungen die Quantoren als genügsam deklariert werden. Dazu wird ihnen ein ? nachgestellt. Zur Veranschaulichung soll die Zeichenkette "abbaccb"dienen:
a.*b Findet den String "abbaccb" (gierig).
a.*?b Findet den String "ab" (genügsam). Er fügt also nur soviele beliebige Zeichen (*) ein, wie mindestens nötig sind damit der Ausdruck matcht.
Gruppieren von Audrücken
(abc|123) Trifft auf den Strin abc oder auf den Strin 123 zu.
(abc|123)+ Trifft auf jede Kombination aus "abc" und "123" zu, solange einer der beiden Teilstrings mindestens einmal vorkommt (z.B abc123abc).
Weitere Zeichen
AUSDRUCK$ Sucht den AUSDRUCK am Zeilenende.
^AUSDRUCK Sucht den AUSDRUCK am Zeilenanfang.
Einige Beispiele
Parsen von html Dateien:
/\<.*?\>/ Findet alle Tags in einem html String.
/\<[^\/].*?\>/ Findet alle Start Tags in einem html String.
/\<table name="treffer".*?\<\/table\>/ Gibt alles zurück, was in der Tabelle mit dem Namen "treffer" steht. Wendet man einen ähnlichen Ausdruck mit <tr> bzw. <td> auf das Ergebnis an, so kann man alle Felder der Tabelle einzeln erfassen.
Valid CSS! Valid HTML 4.01 Transitional