Regulärer Ausdruck

Einführung

Ein Regulärer Ausdruck (kurz Regex oder Regexp von regular expression) stellt in der Programmierung ein verallgemeinertes Suchmuster für Zeichenketten dar. Damit können Inhalte dahingehend geprüft werden, ob sie bestimmten Mustern genügen. Reguläre Ausdrücke können zum Beispiel als Filterkriterien in der Textsuche verwendet werden, indem der Text mit dem Muster des regulären Ausdrucks abgeglichen wird. Dieser Vorgang wird auch Pattern Matching genannt. So ist es beispielsweise möglich, alle Wörter aus einer Wortliste herauszusuchen, die mit S beginnen und auf D enden, ohne die dazwischen liegenden Buchstaben oder deren Anzahl explizit vorgeben zu müssen. Weitere Anwendungsfälle sind die Überprüfung von Emailadressen hinischtlich syntaktisch korrektem Aufbau oder die Angabe eines Datums im richtigen Format.

Reguläre Ausdrücke werden in der Programmierung nach deutlich verschiedenen Konventionen notiert. In diesem Artikel wird das allen Notationen gemeinsame Prinzip erklärt.


Aufbau

Die Syntax von regulären Ausdrücken basiert auf einigen Grundoperationen:

Erweiterter Aufbau

Reguläre Ausdrücke verfügen in der praktischen Anwendung, beispielsweise in Programmiersprachen, weitere zusätzliche Operationen und Notationen auf, die oft unterstützt werden, um die Ausdrücke flexibler und benutzerfreundlicher zu gestalten. Einige dieser zusätzlichen Funktionen könnten sein:

Theoretische Informatik

In der theoretischen Informatik ist bewiesen, dass reguläre Ausdrücke genau die regulären Sprachen beschreiben, die auch von endlichen Automaten erkannt werden können. Das bedeutet, für jeden regulären Ausdruck gibt es einen äquivalenten endlichen Automaten (genauer gesagt, einen deterministischen endlichen Automaten, DFA) und umgekehrt. 

Beispiele

Einfaches Beispiel

Nehmen wir an, wir möchten alle Zeichenketten beschreiben, die mit einem "a" beginnen, gefolgt von einer beliebigen Anzahl von "b"s und enden mit einem "c" oder einem "d". Die entsprechenden regulären Ausdrücke dafür sind:



Setzt man das Ganze zusammen (Konkatenation!), erhält man den regulären Ausdruck:

 ab*(c|d)

Hier sind einige Zeichenketten, die diesem regulären Ausdruck entsprechen:

Und hier sind einige Zeichenketten, die nicht übereinstimmen:

Es ist auch interessant zu bemerken, dass für den gegebenen regulären Ausdruck ab*(c|d), ein deterministischer endlicher Automat (DFA) erstellt werden könnte, der genau diese Sprache erkennt. Dies verbindet den regulären Ausdruck mit der Theorie der endlichen Automaten.

Komplexes Beispiel


Praxis

Reguläre Ausdrücke (Regex) haben zahlreiche praktische Anwendungen in verschiedenen Bereichen der Informatik und Softwareentwicklung. Hier sind einige Bereiche, in denen reguläre Ausdrücke in der Praxis eine wichtige Rolle spielen:


Um zu verstehen, wie in der Programmierung reguläre Ausdrücke notiert werden, wenden wir uns folgendem zu: [+-]?[0-9]+(,[0-9]+)?

Dabei fällt auf, dass es hier offensichtlich zwei Arten von Zeichen gibt: gewöhnliche Zeichen (der Fachausdruck heißt terminale Zeichen), die sich selbst bedeuten, z.B. das Komma, welches nur bedeutet, dass dort ein Komma steht, und Metazeichen, die für die Bedeutung des regulären Ausdrucks selbst eine Bedeutung haben.


Metazeichen:

sowie einige Metazeichen, die in diesem kurzen Beispiel nicht vorkommen:

Bis auf das Minuszeichen sind diese Zeichen nur dann Metazeichen, wenn sie außerhalb von eckigen Klammern stehen. Das kann man auch dazu verwenden, beispielsweise eine Klammer als terminales Zeichen zu notieren: man schreibt dann einfach[(], was, soviel heißt wie "eines der folgenden Zeichen: (". Alternativ kann man auch vor ein Metazeichen einen inversen Schrägstrich setzen, um es auf diese Weise zu maskieren, d.h. an dieser Stelle nur als terminales Zeichen zu verwenden - allerdings werden wir noch sehen, dass dieser inverse Schrägstrich manchmal auch gerade Metazeichen bezeichnet, während die Maskierung mittels eckiger Klammern solche Tücken nicht hat.

Nun wird detaillierter dargelegt, wie die ineinander verschachtelten Teilausdrücke zusammenwirken:

Das letzte Pluszeichen verlangt, dass die davorstehende Ziffer (notiert als [0-9]) mindestens einmal vorkommen muss; ebenso verlangt das Komma, dass das Komma genau einmal vorkommen muss. Das steht aber in einer runden Klammer, die mit einem Fragezeichen versehen ist, so dass doch alles optional ist. Wie passt das zusammen? Man löst solche Fragen, indem man den Ausdruck strikt in seine Bestandteile gliedert. Das Fragezeichen sagt aus, dass der Teilausdruck ,[0-9]+ optional ist. Ist im zu untersuchenden String ein Teil vorhanden, der diesem Teilausdruck entspricht, ist es recht, wenn nicht, auch. Wenn ein solcher Teilstring vorhanden ist - und nur dann - interessieren wir uns dafür, wie er aussieht: und dann gibt es Zeichen, die er zwingend enthalten muss.

Vorrangregeln

Jetzt brauchen wir nur noch die Vorrangregeln zu kennen und schon können wir nach Herzenslust reguläre Ausdrücke schreiben. Die Vorrangregeln sind:

Normen

Nachfolgend sind verbreitetsten Notationen für reguläre Sprachen zusammengestellt die syntaktisch von einander abweichen: