Reguläre Ausdrücke (engl. Regular Expressions; RegEx) werden in fast jeder Programmiersprache (u.a. Perl, C, Java, Python, PHP, Ruby) verwendet, um z.B. aus einer größeren Menge von Informationen genau die richtige herauszufiltern. Ansonsten findet man den Einsatz noch gerne bei Syntax-Validierungen, seien es Email-Adressen oder andere Benutzerangaben.
Beispiele finden sich in fast jedem Programmcode. Ein regulärer Ausdruck stellt dabei ein Muster (Pattern) dar, welcher einen validen String vorgibt.
RegEx ist kein Hexenwerk, aber es ist trotzdem für viele am Anfang unverständlich, da die ganzen Klammern und Sonderzeichen doch ein bisschen verwirren können. Genau aus diesem Grund möchte ich hiermit eine kleine Einleitung in das Thema geben. Wie üblich für eine Einleitungen gehe ich jetzt nicht auf alle Sachen genau ein. Ich gehe das ganze am Beispiel von PHP und der preg_match() Funktion durch. Die hier verwendeten Delimiter sind u.a. im RegEx Coach nicht notwendig.
Ein regulärer Ausdruck besteht in der Regel aus drei Teilen: Dem Delimiter, dem Pattern und dem Modifikator. Alles zusammen bildet dann unseren RegEx, wie wir ihn u.a. in PHP verwenden können.
- Der Delimiter begrenzt unser Muster am Anfang und am Ende vor dem Modifikator. Es darf jedes nicht-alphanumerische Zeichen außer dem \ als Delimiter verwendet werden. Meistens wird ein normales Slash oder ein Ausrufezeichen verwendet.
- Der Pattern ist der eigentliche reguläre Ausdruck. Dieser stellt dementsprechend das Muster dar, nach welchem wir die Eingabe überprüfen möchten.
- Der Modifikator hilft uns, den gesamten Ausdruck noch weiter zu ver- oder entschärfen. Der bzw. die Modifikatoren werden am Ende angehängt und steht noch hinter dem letzten Delimiter.
Modifikator
Der Modifikator kann unser Muster noch weiter eingrenzen bzw. erweitern. Der beliebteste Modifikator ist wahrscheinlich das i, welches dafür sorgt, dass es keine Unterscheidung zwischen Groß- und Kleinbuchstaben mehr gibt (case-insensitiv). Wie bereits erwähnt, stehen die Modifikatoren immer hinter den Delimitern und nicht in dem Muster selbst mit drin. Die drei häufigsten Modifikatoren in der Übersicht:
- Das i als Modifikator sorgt dafür, dass nicht mehr zwischen Groß- und Kleinbuchstaben unterschieden wird. Der nachfolgende Pattern erkennt also alle 4 Kombinationen von Groß- und Kleinbuchstaben des Wortes “Hi” (hi, Hi, HI und hI)
/Hi/i
- Das m (multi-line) sorgt dafür, dass der übergebene String als mehrzeilig angesehen wird. Nach jedem Newline-Zeichen (\n) endet die Überprüfung des regulären Ausdrucks und wird für die nachfolgende Zeilen wiederholt.
- Das s (single-line) lässt den String einzeilig erscheinen. Egal wieviele Newline-Charaktere inbegriffen sind: Der übertragene Text wird als eine Zeile gewertet.
Metazeichen
Als Metazeichen gelten eine Reihe von Sonderzeichen, welche den zu durchsuchenden Text weiter einschränken. Diese werden u.a. eingesetzt, um als Platzhalter für beliebige Zeichen zu dienen.
- Der Punkt . steht für jedes beliebige Zeichen im Text, ausgenommen dem Zeilenumbruch. Das folgende Suchmuster trifft auf jedes Zeichen der Zeichenkette zu:
/./
- Das Zirkumflex ^ kennzeichnet den Zeilenanfang einer Zeichenkette. Jede Zeichenkette, die bei dem folgenden Regex mit “Anfang” beginnt, wird angenommen.
/^Anfang/
- Das Dollarzeichen $ hingegen steht für das Ende einer Zeichenkette. Jede Zeichenkette, die auf “Ende” endet, trifft auf dieses Muster zu:
/Ende$/
- Das Pipe-Symbol | makiert Alternativen für das Suchmuster. Dabei wird die erste auftretende Alternative gefunden. Der folgende Ausdruck wird auf die Zeichenketten zutreffen, die entweder mit “Anfang” anfangen oder auf “Ende” enden:
/^Anfang|Ende$/
- Runde Klammern () dienen der Gruppierung von Suchmustern. Damit würde der folgende Beispiel-Regex auf jede Zeichenkette zutreffen, die mit “Anfang” oder “Start” anfängt und mit “Ende” oder “Ziel” aufhört. Groß- und Kleinschreibung wird dank dem i-Modifikator nicht weiter beachtet.
/^(Anfang|Start)(Ende|Ziel)$/i
- Die Verwendung eckiger Klammern [] (Zeichenklassen) und geschweifter Klammern {} (Quantifikatoren) wird im folgenden besprochen.
Quantifikatoren
Mithilfe von Quantifikatoren kann festgelegt werden, wie oft ein Muster gefunden werden soll. Man unterscheidet im Allgemeinen vordefinierte (*, +, ?, *?, +?, ??) und selbstdefinierte ({n}, {n,}, {n,m}) Quantifikatoren.
- Der Stern * steht nicht – wie aus anderen Anwendungen bekannt – für ein beliebiges Zeichen, sondern als Quantifikator für null oder mehr Übereinstimmungen des Regex. Das folgende Beispiel trifft auf alle Zeichenketten zu, die null oder mehr beliebige Zeichen enthalten – also alle, inklusive leere Zeichenketten.
/.*/
- Das Plus + steht dementsprechend für ein oder mehr Zeichen. Auf das obrige Beispiel bezogen, würde der folgende reguläre Ausdruck nur auf Zeichenketten zutreffen, welche mindestens ein beliebiges Zeichen enthalten:
/.+/
- Das Fragezeichen ? als Quantifikator gibt sich mit null oder einem Ergebnis zufrieden. Der folgende Regex trifft also auf jene Zeichenketten zu, welche nur null oder nur ein x enthält.
/x?/
- Über geschweifte Klammern {} können wir selbstdefinierte Quantifikatoren verwenden. Dabei steht {n} für die Anzahl n, {n,} für die Anzahl von mindestens n Zeichen und {n,m} für die Anzahl von mindestens n, aber maximal m Zeichen. Das nächste Beispiel steht für eine Zeichenkette mit mindestens 3 beliebigen Zeichen.
/.{3,}/
- Hängen wir an einem Quantifikator noch ein Fragezeichen dazu (*?, +?, ??), so erhalten wir anstatt der maximalen Zahl die minimale Zahl von Übereinstimmungen. Damit ist der Quantifikator nicht mehr gierig (greedy) sondern träge (lazy). Mehr Infos über gierige und träge Quantifikatoren.
Die Zeichenklassen
Die Zeichen in den eckigen Klammern [] geben eine Alternative oder direkt Bereiche mit Alternativen an. Wie bereits bei den Quantifikatoren unterscheiden wir auch bei den Zeichenklassen unter vordefinierte und benutzerdefinierte Zeichenklassen.
- Die Angabe von Alternativen kann ganz einfach direkt in den eckigen Klammern geschehen. Dafür gibt man einfach die Zeichen an, welche möglich sind. Der folgende Regex trifft also nur auf “xp” und “xt” zu:
/^x[pt]$/
- Die Angabe von Bereichen macht aber meistens mehr Sinn: So können wir z.B. durch 0-9 alle Ziffern zwischen 0 und 9 abdecken, oder mithilfe von a-z alle (Klein-)Buchstaben zwischen a und z. Der folgende Ausdruck trifft auf alle Zeichenketten zu, welche mit “x” Anfangen und zwei weitere Zeichen aus den Bereich a-z, A-Z und 0-9 beinhalten.
/^x[a-zA-Z0-9]{2}$/
- Das Zirkumflex ^ kann in den eckigen Klammern übrigens zur Verneinung verwendet werden. Damit spricht der folgende RegEx alle Versionen von x+Buchstabe an, außer das “xt” und das “xz”.
/^x[^tz]$/
- Vordefinierte Zeichenklassen sind ebenfalls in den meisten RegEx-Implementierungen vorhanden. Eine kleine, passende Liste findet ihr dazu auch bei webmasterpro.de.
Suche nach Metazeichen
Über einen Regex können wir nach beliebigen Zeichen suchen. Nichtsdestotrotz gibt es eine Ausnahme. Die sog. Metazeichen können wir nicht einfach so einsetzen. Wer nach den folgenden Zeichen suchen möchte, der muss dies zuerst erkenntlich machen: Vor dem Metazeichen wird ein Backslash eingesetzt, um das Zeichen zu entwerten. Die folgenden Sonderzeichen gelten als Metazeichen:
* + ? . ( ) [ ] { } \ / | ^ $ < >
RegEx – Beispiele
Natürlich möchte ich auch ein paar Beispiele zeigen. Da reguläre Ausdrücke überall verwendet werden, gibt es auch die wildesten Ausführungen. Aber auch kleine Dinge werden gerne über einen regulären Ausdruck überprüft.
- Der folgende Ausdruck validiert Email-Adressen, welche ja immer ein gleiches bzw. ähnliches Muster besitzen. Vor dem @-Zeichen stehen Buchstaben, Zahlen und ein paar wenige Sonderzeichen. Nach dem @ darf (in diesem Beispiel) nur noch ein Text (Host), ein einzelner Punkt und 2-6 Zeichen für die TLD-Endung folgen.
/^([-_.\w]+@[a-zA-Z0-9_]+?\.[a-zA-Z0-9]{2,6})$/
- Der nächste Ausdruck zeigt das Muster eines Datums im Format DD/MM/YYYY. Hier erkennt man den Einsatz der Backslashes für die Metazeichen.
/(\d{1,2}\/\d{1,2}\/\d{4})/
Weitere Beispiele sollten sich zu genüge im Internet finden. Ansonsten lohnt natürlich ein Blick in die unten aufgeführten Verweise. Falls ihr irgendwelche Verbesserungsvorschläge habt, welche nicht den Rahmen einer Einleitung zum Thema RegEx sprengen würden, dann hinterlasst mir doch bitte einen Kommentar.
Quellen und weitere Links:
How Possessive Quantifiers Work
RegEx Style Cheat Sheet
Using Backreferences in The Regular Expression
RegExr to learn, build, & test Regular Expressions (RegEx / RegExp).