Regulärer Ausdruck
In der Informatik ist ein regulärer Ausdruck (auch: RegExp, regexp, regex, Reguläre Ausdrücke; engl. regular expression) 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. |
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. |
+ | 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 ^• findet alle mit einem Tabulatorzeichen beginnenden Zeilen |
$ | Zeilenende *$ findet alle Zeilen mit einem oder mehreren Leerzeichen am Zeilenende |
\< | Wortanfang |
\> | Wortende |
\ | "eskapiert" das folgende Zeichen, d. h. das folgende Zeichen wird nicht als Metazeichen interpretiert. \. findet einen Punkt |
\(\) | 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 |
[^ ] | Schliesst alle in "character class" enthaltenen Zeichen aus. [^0-9] schliesst alle Zahlen 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 é |