Regulärer Ausdruck

Aus Mikiwiki
Wechseln zu: Navigation, Suche

In der Informatik ist ein regulärer Ausdruck (engl. regular expression; auch: regex, RegExp, regexp) eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Reguläre Ausdrücke finden hauptsächlich in der Programmierung Verwendung; für fast alle Programmiersprachen existieren Implementierungen.

Beispiel Regulärer Ausdruck
13-stellige ISBN (?=.{13}$)\d{1,5}(|\-)\d{1,7}(|\-)\1\d{1,6}\1(\d|X)
MAC-Adresse ([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])

Reguläre Ausdrücke stellen erstens eine Art Filterkriterium für Texte dar, indem der jeweilige reguläre Ausdruck in Form eines Musters mit dem Text abgeglichen wird. So ist es beispielsweise möglich, alle Wörter, die mit S beginnen und mit D enden, zu matchen (von engl. "to match", dt. "auf etwas passen", "übereinstimmen", "eine Übereinstimmung finden"), ohne die zwischenliegenden Buchstaben ausdrücklich vorgeben zu müssen.

Ein weiteres Beispiel für den Einsatz als Filter ist die Möglichkeit, komplizierte Textersetzungen durchzuführen, indem man die zu suchenden Zeichenketten durch reguläre Ausdrücke beschreibt.

Zweitens lassen sich aus regulären Ausdrücken, als eine Art Schablone, auch Mengen von Wörtern erzeugen, ohne jedes Wort einzeln angeben zu müssen. So lässt sich beispielsweise ein Ausdruck angeben, der alle denkbaren Zeichenkombinationen (Wörter) erzeugt, die mit S beginnen und mit D enden.

Folgende Programme verarbeiten Textmuster für die unterschiedlichsten Programme und Programmiersprachen zu regulären Ausdrücken.

Programm Arbeitsumgebung
txt2regex Befehlszeile
kregexpeditor KDE

Der umgekehrte Schrägstrich ( \ ) nimmt allen Sonderzeichen ihre Bedeutung. Der Punkt wird also mit \. und der umgekehrte Schrägstrich mit \\ gesucht.

Mit einem Stern oder Plus versehen passt ein Teilmuster immer auf den längstmöglichen string, daher heissen diese Operatoren "gierig" [engl. greedy].

Mit Klammern lassen sich Teilausdrücke zusammenfassen. In der Praxis sollten mit dem Strich ("|") verknüpfte Alternativen immer in KLammern gesetzt werden, weil dadurch der ganze Ausdruck übersichtlicher wird und sich beim Kombinieren von Teilausdrücken weniger Fehler einschleichen. Wiederholungszeichen ("+" und "?") wirken auch auf Klammerausdrücke. Ausserdem erlauben Klammern den Rückgriff auf die Teile des durchsuchten Textes, auf die ein Teilausdruck zuletzt gepasst hat. Dabei steht "\1" für den Treffer der ersten Klammer, "\2" für den Treffer der zweiten Klammer usw.

grep, sed GNU grep, GNU sed egrep GNU egrep Perl
Platzhalter
ein beliebiges Zeichen . . . . .
ein Zeichen aus einer Liste [ ] [ ] [ ] [ ] [ ]
Umkehrung der Liste [^ ] [^ ] [^ ] [^ ] [^ ]
Ziffern [0-9] [0-9] [0-9] [0-9] [0-9] oder /d
Wiederholungen
beliebig viele, auch keins * * * * *
beliebig viele, mindestens eins \+ + + +
eins oder keins \? ? ? ?
genau n \{n\} {n} {n}
n oder mehr \{n,\} {n,} {n,}
n bis m \{n,m\} {n,m} {n,m}
Anker
Zeilenanfang ^ ^ ^ ^ ^
Zeilenende $ $ $ $ $
Wortanfang \< \<
Wortende \> \>
Wortanfang oder -ende \b \b \b
anderes
oder \| \| \| \|
Gruppierung \(\) \(\) () () ()
Inhalt der ersten Klammer \1 \1 \1 \1 oder $1
Sonderzeichen suchen \ \ \ \ \
Ausdruck Bedeutung
abc Die Zeichenfolge "abc".
a.c Das Zeichen "a", gefolgt von einem beliebigen Zeichen und einem "c".
a.* Das Zeichen "a", gefolgt von keinem, einem oder beliebig vielen beliebigen Zeichen.
a.? Das Zeichen "a", gefolgt von einer beliebigen Zeichenkette, die mindestens aus einem "a" und einem weiteren Zeichen besteht.
[abl]* Passt auf "aaaa", auf "blabla" und auch auf den Leerstring.
[0-9]{1,7} Steht für eine bis sieben Ziffern.
[A-Z]{0,1} Steht für keines bis genau ein Vorkommen des vorangehenden Zeichens.
[0-9]{0,} Steht für keine bis beliebig viele Wiederholungen (entspricht dem Operator Stern).
[0-9]{1,} Steht für eine bis beliebig viele Wiederholungen (entspricht dem Operator Plus, den es jedoch beim normalen grep und vielen anderen Programmen wie sed nicht gibt).
[A-Z]{3} Passt auf genau drei Zeichen.
[A-Z]{1,3}-[A-Z]{1,2} [0-9]{1,4} Passt auf deutsche Autokennzeichen.
<.*> Passt vom ersten "<" bis zum letzten ">" in einer Zeile, also auf den farbigen Teil folgender Zeile:

Ein <a href="#a">Anker</a> ist ein Anker.

<[^>]*> Findet ein "<" gefolgt von belieig vielen Nicht-">" gefolgt von einem ">", passt also auf den farbigen Teil folgender Zeile:

Ein <a href="#a">Anker</a> ist ein Anker.
Probleme bringen z. B. auskommentierte tags:
<!-- <a href="http://www.post.ch/"> geht nicht -->
Einfache reguläre Ausdrücke stossen hier an ihre Grenzen. Abhilfe liegt in den mächtigeren Ausdrücken von Perl wo der Ausdruck <!-.*?-> einen HTML-Kommentar auch findet, wenn in derselben Zeile ein zweiter steht.

Bla(bla)+ Passt auf "Blabla", "Blablabla" usw., aber nicht auf "Blaabl".
Bla[bla]+ Passt auf "Blaabl".
[0-9]+(,[0-9]*)? Passt auf Zahlen mit mindestens einer Ziffer, auf die ein Komma und beliebig viele Nachkommastellen folgen.
([a-z])\1 Findet alle doppelten Kleinbuchstaben. Wenn dieser Ausdruck auf das Wort "Suppe" passt, passt die eckige Klammer auf das erste "p". Dann nimmt "\1" den Wert der ersten Klammer (also "p") an und der ganze Ausdruck trifft auf die beiden "p" zu.
[a-z]{2} Passt auf zwei beliebige Kleinbuchstaben zu, die auch verschieden sein dürfen.
([A-Za-z]+)+\1 Findet Wort-Dopplungen. Allerdings passt dieser Ausdruck auch auf "Rosie sieht rot".
\b([A-Za-z]+)\b +\b\b\1\b Ausdruck zum Auffinden doppelter Wörter mit GNU-egrep, wobei auch die Ränder eines Wortes ("\b") beachtet werden.
^ *# Passt auf auskommentierte Zeilen in Shellskripten.
^$ Passt auf Leerzeilen.
+$ Passt auf überflüssige Leerzeichen am Zeilenende.

Für den Suchbegriff kann in vielen Unix-Programmen (z. B. grep, vi) ein regulärer Ausdruck erwendet werden. Reguläre Ausdrücke können komplexeste Suchmuster beschreiben.

Der Stern ("*") und das Pluszeichen ("+") sind Multiplikatoren und beziehen sich immer auf ein Zeichen links neben sich. Das Pluszeichen besagt, dass das Zeichen einfach oder mehrfach auftreten kann. Beim Stern ist auch denkbar, dass das Zeichen gar nicht erscheint. Die Suche nach "abc*" findet also "abc", "abcc", "abcccc", aber auch "ab". "M.*s" findet "Maus" und "Moos", aber auch "Murks" und "Meeresfrüchte", letzteres weil der reguläre Ausdruck ja nicht besagt, dass das Wort hinter s enden soll.

Regular expression Bedeutung
. Irgendein einzelnes Zeichen (ausser new line), auch Leerschlag.

M..s findet Maus, Moos und Murks, aber nicht Murks.

* Das vorangehende Zeichen kommt beliebig oft vor.

.* findet irgendeine Anzahl von Zeichen (ausser new line), auch Leerschläge.
".*" findet ein oder mehrere Zeichen in Hochkommas
grep '<.*>' file gibt alle von spitzen Klammern begrenzten Tags aus der Datei "file" mit ihren Zeilen aus.
[15]0* findet 1, 5, 10, 50, 100, 500, usw.
[abl]* findet aaaa, bb, blabla, usw.
␣* findet keines, eines oder mehrere Leerzeichen
␣␣* findet ein oder mehrere Leerzeichen
␣"*hypertext"*␣ findet folgende Zeichenfolgen:

  • ␣hypertext␣
  • ␣"hypertext␣
  • ␣"hypertext"␣
  • ␣hypertext"␣
  • ␣""hypertext""␣ usw.

A.*E findet irgendeine Zeichenfolge, die mit A beginnt und mit E endet.

+ Das vorangehende Zeichen kommt mindestens einmal vor.
? findet kein oder einmaliges Vorkommen des vorhergehenden Zeichens [nicht unterstützt von sed]

80[234]?86 findet 8086, 80286, 80386 und 80486.

^ Zeilenanfang

^&#149; findet alle mit einem Tabulatorzeichen beginnenden Zeilen
ls -l | grep ^d zeigt nur die Verzeichnisse (directories) an.

$ Zeilenende

␣␣*$ findet alle Zeilen mit einem oder mehreren Leerzeichen am Zeilenende
^$ findet leere Zeilen
^␣*$ findet leere Zeilen, auch solche, die ein oder mehrere Leerzeichen enthalten

\< Wortanfang
\> Wortende
\ "eskapiert" das folgende Zeichen, d. h. das folgende Zeichen wird nicht als Metazeichen interpretiert.

\. findet einen Punkt
\.␣␣␣ findet einen Punkt gefolgt von drei Leerzeichen
\\ findet einen umgekehrten Schrägstrich
\\f findet die Zeichenfolge "\f"
\n findet eine Ziffer von 1 bis 9

\(\) Markierung eines Bereichs.
\1 \2 ... Referenz auf die erste und zweite Markierung
\{n\} Genau n-mal (n=0-255)
\{n,\} Mindestens n-mal (n=0-255)
\{n,m\} n- bis m-mal (n=0-255, m=0-255)
[ ] Jede "character class" entspricht genau einem Zeichen

[abg] findet das einzelne Zeichen a, f oder g
[Ww]hat findet "What" und "what", ignoriert also die Grossschreibung
[a-zA-Z] findet einen Klein- oder einen Grossbuchstaben
[0-9] findet irgendeine einzelne Ziffer
\.H[123] findet .H1, .H2 und .H3
grep '.H[123]' ch0[12] findet .H1, .H2 und .H3 in den Dateien "ch01" und "ch02". Der erste Ausdruck steht in einfachen Hochkommas, damit der Ausdruck an grep weitergegeben wird. Andernfalls würde er durch die Shell interpretiert.

[^ ] Schliesst alle in "character class" enthaltenen Zeichen aus.

[^0-9] schliesst alle Zahlen aus.
[^/] steht für ein beliebiges Zeichen ausser dem Schrägstrich, also jedes in einem Unix-Dateinamen erlaubte Zeichen.
[^^] schliesst das Caret aus.

ies) findet company und companies
(^|␣) findet Zeilenanfänge und Leerschläge

POSIX definiert:

  • Basic regular expressions / BRE wie von grep und sed verwendet
  • Extended regular expressions wie von egrep und awk verwendet
Regular expression Bedeutung
[[alpha:]!] entspricht allen alphabetischen Zeichen sowie dem Ausrufezeichen (!)
[[.ch.]] entspricht der Zeichenfolge ch
[[=e=]] entspricht (in französischer Umgebung) den Zeichen e, è oder é

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
country DE.gif Wikipedia ger Regulärer Ausdruckwbm Enzyklopädischer Artikel