Der Begriff "Regulärer Ausdruck" stammt von dem Sprachwissenschaftler Noam Chomsky und wird in der Informatik verwendet. Er bezeichnet ein Schema zum Erzeugen von Zeichenketten nach bestimmten Regeln. Mit einem regulären Ausdruck kann eine Menge von Zeichenketten erzeugt werden (die Sprache). Genauso kann überprüft werden, ob eine Zeichenkette in der dieser Menge liegt. Letzteres Verfahren wird auch als Pattern Matching (engl. Mustererkennung) bezeichnet.
Sind a und b reguläre Ausdrücke, so können sie wie folgt zu komplexeren Ausdrücken zusammengesetzt werden:
| (a) | beschreibt weiterhin den regulären Ausdruck a. Mit runden Klammern werden Ausdrücke gruppiert. Dadurch können nachfolgende Operatoren sowohl auf einzelne Zeichen als auch auf bereits reguläre Ausdrücke angewendet werden. |
| a? | steht für das null- oder einfache Auftreten von a. |
| a* | beschreibt die Häufigkeit von a. Der Ausdruck kann keinmal oder beliebig oft vorkommen. |
| a+ | Der reguläre Ausdruck a muß mindestens einmal, kann aber beliebig oft vorkommen. |
| a|b | steht für eine ODER-Verknüpfung der beiden Ausdrücke. Damit werden Zeichenketten gefunden, die auf a oder auf b passen. |
| ab | entspricht der UND-Verknüpfung von zwei regulären Ausdrücken. Wenn z.B. a für "who" und b für "(was|is)" steht, dann erzeugt ab die beiden Wörter "whois" und "whowas" bzw. erkennt die beiden Wörter "whois" und "whowas". |
Zur Bildung von regulären Ausdrücken können in den Unix-Werkzeugen zusätzlich folgende Erweiterungen benutzt werden. Sie ergeben für diese erneut reguläre Ausdrücke.
| [abc] | steht für eines der Zeichen "a", "b" oder "c". (*) |
| [^xyz] | paßt auf jedes Zeichen, außer auf "x", "y" und "z". (*) |
| . | paßt auf jedes Zeichen |
| \0nn | entspricht dem Zeichen, welches den Oktalwert nn hat. |
| \xnn | repräsentiert das Zeichen, das den Hexadezimalwert nn hat. |
| ^a | Der reguläre Ausdruck a muß am Zeilenanfang stehen. |
| a$ | Der reguläre Ausdruck a muß am Ende einer Zeile auftreten. |
Da zur Beschreibung der regulären Ausdrücke verschiedene Kontrollzeichen benötigt werden, können diese nicht mehr in den Ausdrücken selbst vorkommen. Aus diesem Grund müssen sie in einem solchen Fall geschützt dargestellt werden. Ihnen wird ein Backslash vorangestellt. Gleiches gilt für ähnliche Sonderzeichen in der Shell.
Der in Schrägstrichen eingefaßte reguläre Ausdruck
/Th?om(as)? (Ch|K)rist(ia|e)nss?s[eo]n/ |
Verschiedene Programme haben ihr Verständnis von regulären Ausdrücken noch erweitert. So ist es z.B. beim Emacs, sed und perl möglich Suchen-und-Ersetzen mit regulären Ausdrücken durchzuführen und Teile des gefundenen Ausdruckes in speziellen Variablen zwischenzuspeichern.
Zudem ist es teilweise möglich, die Unterscheidung von Groß- und Kleinschreibung auszuschalten. Bei perl ist der Autor sogar soweit gegangen, daß spezielle Meta-Zeichen definiert sind, um bestimmte Gruppen von Zeichen wie Buchstaben, Leerzeichen, Zahlen etc. leichter angeben zu können.
| ? | paßt auf ein beliebiges Zeichen. |
| * | entspricht beliebig vielen Zeichen, z.B. auch keinem. |
Auf Shellebene (z.B. bei Verwendung der bash) wird diese einfachere Methode verwendet, um Dateinamen auszuwählen. Allerdings wird sie erneut um folgende Fähigkeit ergänzt.
| {abc,xyz,etc} | paßt auf den regulären Ausdruck (abc|xyz|etc) |
ls -l /usr/bin/{,s,proc}mail*
|
/usr/bin/mail /usr/bin/smail /usr/bin/smail.old /usr/bin/procmail /usr/bin/mailto |
ls -l /usr/bin/*mail |
/usr/bin/mail /usr/bin/smail /usr/bin/rmail /usr/bin/procmail /usr/bin/sendmail |
| > | Leitet die Ausgabe des Befehls in eine Datei um. Eine schon bestehende wird überschrieben. |
| >> | s.o., allerdings wird die Ausgabe an eine bestehende angehängt, sofern sie existiert. |
| 2> | Leitet die Fehlerausgabe in eine Datei um. Viele Programme unterscheiden zwischen normaler und Fehlerausgabe, die normalerweise ebenfalls auf dem Terminal ausgegeben würde. |
| 2>&1 | Hier wird die Fehlerausgabe auf den normalen Ausgabestrom umgeleitet. Wird dieses nach einer normalen Umleitung geschrieben, dann landen die Fehlermeldungen in der gleichen Datei wie die normalen Ausgaben. |
| < | Nimmt die Eingabe für den Befehl aus der angegebenen Datei anstatt von der Tastatur |
| | | Die Ausgabe des linksstehenden Befehls wird als Eingabe für den rechts vom Pipezeichen stehendenden Befehl benutzt. |
Martin Schulze