Regex-Muster Spickzettel: Gängige Ausdrücke erklärt

· 12 Min. Lesezeit

Inhaltsverzeichnis

Reguläre Ausdrücke (Regex) sind eines der mächtigsten Werkzeuge im Arsenal eines Entwicklers. Ob Sie E-Mail-Adressen validieren, Logdateien parsen, Daten aus Text extrahieren oder komplexe Suchen-und-Ersetzen-Operationen durchführen – Regex bietet eine prägnante und flexible Möglichkeit, mit Textmustern zu arbeiten.

Dieser umfassende Leitfaden deckt alles ab, von der grundlegenden Syntax bis zu fortgeschrittenen Techniken, mit praktischen Beispielen, die Sie sofort in Ihren Projekten verwenden können. Wir erkunden Regex in verschiedenen Programmiersprachen, teilen Tipps zur Performance-Optimierung und helfen Ihnen, häufige Fehler zu vermeiden, über die selbst erfahrene Entwickler stolpern.

Regex-Grundlagen

Im Kern ist ein regulärer Ausdruck eine Zeichenfolge, die ein Suchmuster definiert. Wenn Sie dieses Muster gegen einen String ausführen, versucht die Regex-Engine, Übereinstimmungen gemäß den von Ihnen festgelegten Regeln zu finden.

Ein Regex-Muster besteht aus zwei Arten von Zeichen: literale Zeichen, die sich selbst exakt entsprechen, und Metazeichen, die spezielle Bedeutungen haben. Zum Beispiel entspricht das Muster /hello/ dem literalen Text "hello" überall in einem String. Aber /h.llo/ verwendet das Punkt-Metazeichen, um "hello", "hallo", "hxllo" oder jede andere Fünf-Zeichen-Sequenz zu finden, die mit "h" beginnt und mit "llo" endet.

Wesentliche Metazeichen

Hier ist eine Referenztabelle der grundlegendsten Regex-Metazeichen, die Sie täglich verwenden werden:

Metazeichen Beschreibung Beispiel Entspricht
. Beliebiges einzelnes Zeichen (außer Zeilenumbruch) c.t cat, cot, c9t, c@t
\d Beliebige Ziffer [0-9] \d{3} 123, 456, 789
\D Beliebiges Nicht-Ziffer-Zeichen \D+ abc, XYZ, @#$
\w Wortzeichen [a-zA-Z0-9_] \w+ hello, test_123
\W Nicht-Wortzeichen \W @, #, Leerzeichen, !
\s Leerzeichen (Leerzeichen, Tab, Zeilenumbruch) \s+ Einzelne oder mehrere Leerzeichen
\S Nicht-Leerzeichen \S+ Beliebige sichtbare Zeichen
\b Wortgrenze \bcat\b "cat" aber nicht "category"
^ Anfang des Strings/der Zeile ^Hello Zeilen, die mit "Hello" beginnen
$ Ende des Strings/der Zeile end$ Zeilen, die mit "end" enden

Profi-Tipp: Verwenden Sie den Regex-Tester, um mit diesen Mustern in Echtzeit zu experimentieren. Sie können gegen Ihren eigenen Beispieltext testen und Übereinstimmungen sofort hervorgehoben sehen.

Sonderzeichen maskieren

Wenn Sie ein literales Metazeichen (wie einen Punkt oder Stern) finden müssen, müssen Sie es mit einem Backslash maskieren. Zum Beispiel entspricht \. einem literalen Punkt und \* einem literalen Stern.

Zeichen, die maskiert werden müssen, sind: . * + ? ^ $ { } [ ] ( ) | \

Zeichenklassen & Quantifizierer

Zeichenklassen ermöglichen es Ihnen, Zeichensätze zu definieren, die übereinstimmen sollen, während Quantifizierer angeben, wie oft ein Muster wiederholt werden soll. Zusammen bilden sie das Rückgrat der meisten Regex-Muster.

Zeichenklassen

Eckige Klammern erstellen eine Zeichenklasse, die jedem einzelnen Zeichen innerhalb der Klammern entspricht:

Muster Beschreibung Beispiel-Übereinstimmungen
[abc] Entspricht a, b oder c a, b, c (ein Zeichen)
[^abc] Entspricht allem außer a, b oder c d, e, 1, @, usw.
[a-z] Entspricht jedem Kleinbuchstaben a bis z
[A-Z] Entspricht jedem Großbuchstaben A bis Z
[0-9] Entspricht jeder Ziffer 0 bis 9 (wie \d)
[a-zA-Z] Entspricht jedem Buchstaben Alle Buchstaben, jede Groß-/Kleinschreibung
[a-zA-Z0-9] Entspricht jedem alphanumerischen Zeichen Buchstaben und Zahlen
[a-z&&[^aeiou]] Nur Konsonanten (Schnittmenge) b, c, d, f, g, usw.

Quantifizierer

Quantifizierer geben an, wie oft das vorhergehende Element übereinstimmen soll. Sie sind unerlässlich für das Finden von Mustern unterschiedlicher Länge:

Gieriges vs. faules Matching

Das Verständnis des Unterschieds zwischen gierigen und faulen Quantifizierern ist entscheidend für das Schreiben effizienter Regex-Muster. Standardmäßig sind Quantifizierer gierig — sie entsprechen so viel Text wie möglich, während das Gesamtmuster noch übereinstimmt.

Betrachten Sie dieses Beispiel mit dem String "<div>content</div><div>more</div>":

Die faule Version fügt ein ? nach dem Quantifizierer hinzu und weist die Regex-Engine an, so wenig wie möglich zu entsprechen, während das Muster noch erfüllt wird.

Schnell-Tipp: Verwenden Sie beim Parsen von HTML oder XML immer faule Quantifizierer, um das Übereinstimmen über mehrere Tags hinweg zu vermeiden. Noch besser: Verwenden Sie eine geeignete Parser-Bibliothek anstelle von Regex für komplexes Markup.

Gängige Regex-Muster

Hier sind bewährte Regex-Muster für gängige Validierungs- und Extraktionsaufgaben. Diese Muster werden in Produktionsanwendungen weltweit verwendet.

E-Mail-Validierung

Ein praktisches E-Mail-Validierungsmuster, das die meisten realen Fälle abdeckt:

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Dieses Muster stellt sicher, dass die E-Mail einen lokalen Teil (vor @), einen Domainnamen und eine gültige Top-Level-Domain hat. Beachten Sie, dass perfekte E-Mail-Validierung allein mit Regex unmöglich ist — der offizielle RFC 5322-Standard ist unglaublich komplex. Für den Produktionseinsatz sollten Sie eine dedizierte E-Mail-Validierungsbibliothek verwenden.

Telefonnummern

US-Telefonnummer mit optionaler Landesvorwahl und verschiedenen Formatierungen:

^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$

Dies entspricht Formaten wie:

URLs

Entspricht HTTP- und HTTPS-URLs mit optionalem www-Präfix:

^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$

IP-Adressen

IPv4-Adressvalidierung:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

Dies stellt sicher, dass jedes Oktett zwischen 0 und 255 liegt.

Datumsangaben

ISO 8601-Datumsformat (JJJJ-MM-TT):

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

US-Datumsformat (MM/TT/JJJJ):

^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$

Kreditkartennummern

Grundlegende Kreditkartenvalidierung (entfernt Leerzeichen und Bindestriche):

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$

Dieses Muster validiert Visa-, MasterCard-, American Express- und Discover-Karten. Verwenden Sie immer den Luhn-Algorithmus für die tatsächliche Validierung.

Passwörter

Starkes Passwort, das mindestens 8 Zeichen, einen Großbuchstaben, einen Kleinbuchstaben, eine Ziffer und ein Sonderzeichen erfordert:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

Dies verwendet Lookahead-Assertions (im nächsten Abschnitt behandelt), um sicherzustellen, dass alle Anforderungen erfüllt sind.

Profi-Tipp: Testen Sie diese Muster mit dem Regex-Tester und speichern Sie Ihre Favoriten für schnellen Zugriff. Sie können auch den Code-Formatierer verwenden, um Regex-Muster in Ihrem Quellcode aufzuräumen.

Anker, Gruppen & Lookaheads

Diese fortgeschrittenen Funktionen geben Ihnen präzise Kontrolle darüber, wo Übereinstimmungen auftreten und wie Muster erfasst werden.

Anker

Anker entsprechen keinen Zeichen — sie entsprechen Positionen im String:

Beispiel: \bcat\b entspricht "cat" als ganzes Wort, aber nicht dem "cat" in "category" oder "concatenate".

Erfassungsgruppen

Klammern erstellen Erfassungsgruppen, die übereinstimmende Teilstrings extrahieren:

^(\d{3})-(\d{3})-(\d{4})$

Dieses Muster entspricht einer Telefonnummer und erfasst die Vorwahl, das Präfix und die Leitungsnummer separat. Sie können diese Erfassungen in Ersetzungsstrings referenzieren oder sie programmatisch extrahieren.

Nicht-erfassende Gruppen

Verwenden Sie (?:...), wenn Sie Gruppierung benötigen, aber die Übereinstimmung nicht erfassen möchten:

(?:https?|ftp)://[^\s]+

Dies entspricht URLs, die mit http, https oder ftp beginnen, ohne eine Erfassungsgruppe für das Protokoll zu erstellen.

Benannte Erfassungsgruppen

Benannte Gruppen machen Ihr Regex lesbarer und wartbarer:

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

Sie können diese nach Namen statt nach Nummer referenzieren, was Ihren Code klarer macht.

Lookahead-Assertions

Lookaheads prüfen, ob ein Muster voraus existiert, ohne Zeichen zu verbrauchen:

Beispiel: \d+(?= dollars) entspricht Zahlen, denen " dollars" folgt, aber schließt " dollars" nicht in die Übereinstimmung ein.

Lookbehind-Assertions

Lookbehinds prüfen, was vor der aktuellen Position kommt:

Beispiel: (?<=\$)\d+ entspricht Zahlen, denen ein Dollarzeichen vorangeht, aber schließt das $ nicht in die Übereinstimmung ein.

Beachten Sie, dass JavaScript erst in ES2018 Lookbehind-Unterstützung erhielt, also prüfen Sie die Kompatibilität, wenn Sie ältere Browser unterstützen.

Regex in JavaScript

JavaScript bietet robuste Regex-Unterstützung durch das RegExp-Objekt und String-Methoden. So verwenden Sie Regex effektiv in JavaScript-Anwendungen.

Regex-Muster erstellen

Sie können Regex-Muster auf zwei Arten erstellen:

// Literale Notation (bevorzugt für statische Muster)
const pattern1 = /\d{3}-\d{3}-\d{4}/;

// Konstruktor (nützlich für dynamische Muster)
const pattern2 = new RegExp('\\d{3}-\\d{3}-\\d{4}');

Beachten Sie die doppelten Backslashes im Konstruktor — Sie müssen Backslashes in Strings maskieren.

Regex-Flags

JavaScript unterstützt mehrere Flags, die das Regex-Verhalten ändern: