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:
*— Null oder mehrmals (gierig)+— Ein oder mehrmals (gierig)?— Null oder einmal (optional){3}— Genau 3-mal{3,}— 3 oder mehrmals{3,6}— Zwischen 3 und 6 Mal*?— Null oder mehrmals (faul/nicht-gierig)+?— Ein oder mehrmals (faul/nicht-gierig)??— Null oder einmal (faul)
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>":
- Gierig:
<div>.*</div>entspricht dem gesamten String vom ersten<div>bis zum letzten</div> - Faul:
<div>.*?</div>entspricht jedem<div>...</div>-Paar separat
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:
- 555-123-4567
- (555) 123-4567
- +1 555 123 4567
- 5551234567
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:
^— Anfang des Strings (oder der Zeile im Mehrzeilenmodus)$— Ende des Strings (oder der Zeile im Mehrzeilenmodus)\b— Wortgrenze (zwischen \w und \W)\B— Nicht-Wortgrenze\A— Anfang des Strings (immer, auch im Mehrzeilenmodus)\Z— Ende des Strings (immer, auch im Mehrzeilenmodus)
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:
(?=...)— Positiver Lookahead (muss gefolgt werden von)(?!...)— Negativer Lookahead (darf nicht gefolgt werden von)
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:
(?<=...)— Positiver Lookbehind (muss vorangegangen sein von)(?<!...)— Negativer Lookbehind (darf nicht vorangegangen sein von)
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: