Regex-Spickzettel

Ein durchsuchbarer Spickzettel für reguläre Ausdrücke im JavaScript-Geschmack: Zeichenklassen, Klammermengen, Quantoren, Anker, Lookaround, Gruppen und Flags, jeweils mit Beispiel.

Einundvierzig Regex-Tokens mit Beispielen. Filtere über Tokens, Beschreibungen und Beispiele und kopiere dann die Syntax, die du brauchst. Deckt den JavaScript (ECMAScript)-Geschmack ab, der in Browsern und Node.js verwendet wird.

Reguläre Ausdrücke sicher lesen und schreiben

Eine Syntax-Tabelle, kein Tutorial

Reguläre Ausdrücke sind von Natur aus dicht. Ein Muster wie ^(?:\d{1,3}\.){3}\d{1,3}$ packt einen ganzen IPv4-Validator in dreißig Zeichen, was wunderbar ist, wenn du es geschrieben hast, und elend, wenn du den Ausdruck von jemand anderem liest. Der Großteil der Schwierigkeit ist nicht konzeptuell – es ist, dass der Wortschatz groß, knapp und leicht nur halb erinnert ist.

Diese Seite ist eine Nachschlagetabelle für diesen Wortschatz, geordnet so, wie Muster tatsächlich gebaut werden: was ein einzelnes Zeichen matcht, wie du deine eigenen Zeichensätze definierst, wie du „wiederhole das" sagst, wo du den Match verankerst, wie du gruppierst und alternierst, und welche Flags das Verhalten der Engine ändern. Der Filter durchsucht Tokens, Beschreibungen und Beispiele auf einmal, sodass das Tippen von „lazy", „boundary" oder „lookbehind" direkt zur Zeile springt, an die du dich nur halb erinnerst.

Welchem Geschmack diese Tokens folgen

Reguläre Ausdrücke sind nicht eine Sprache. Grep, PCRE, Python, Java, Go's RE2 und JavaScript teilen sich einen gemeinsamen Kern, stimmen aber an den Rändern nicht überein. Alles hier zielt auf den JavaScript-Geschmack ab, der von ECMAScript definiert wird, weil das im Browser, in Node.js und in den meisten Frontend-Werkzeugen läuft.

Drei Unterschiede sind erwähnenswert. Erstens: Lookbehind – (?<=...) und (?<!...) – wird in modernen JavaScript-Engines unterstützt, fehlt aber in Go's RE2 und in älteren Safari-Versionen, sodass Muster, die darauf beruhen, nicht überall portabel sind. Zweitens: JavaScript hat kein x-Verbose-Flag, sodass du ein Muster nicht wie in Python über mehrere Zeilen mit Kommentaren verteilen kannst; lange Muster werden meist aus String-Fragmenten zusammengesetzt. Drittens: \d und \w sind in JavaScript standardmäßig nur ASCII; \w matcht also keine akzentuierten Buchstaben oder CJK-Zeichen, es sei denn, du wechselst zu Unicode-Eigenschafts-Escapes wie \p{L} mit dem u-Flag.

Muster schreiben, die wartbar bleiben

Zwei Gewohnheiten verhindern die meisten Regex-Probleme. Die erste ist, bewusst zu verankern. Ein nicht verankertes Muster sucht an beliebiger Stelle im String nach einem Match, was du beim Scannen willst und fast nie beim Validieren. Das Hinzufügen von ^ und $ verwandelt „enthält etwas, das wie ein Datum aussieht" in „ist ein Datum", und genau dieser Unterschied steckt hinter einem überraschend großen Anteil an Validierungsfehlern.

Die zweite ist, Faulheit und negierte Zeichensätze gegen gierige Wildcards zu bevorzugen. Der klassische Fehler ist <.+> auf HTML-ähnlichem Text: Weil + gierig ist, verschluckt es alles bis zum letzten > in der Zeile. <.+?> oder, besser, <[^>]+> matcht ein einzelnes Tag. Die negierte-Klasse-Version ist auch deutlich schneller, weil die Engine nie zurückverfolgen muss.

Schließlich solltest du dir katastrophales Backtracking bewusst sein. Verschachtelte Quantoren, wie in (a+)+b, können die Engine exponentiell viele Möglichkeiten ausprobieren lassen, bevor sie schließt, dass es keinen Match gibt, was einen Validierungsaufruf zu einem Denial-of-Service-Vektor macht, sobald das Muster auf Nutzereingaben trifft. Wenn ein Muster eine quantifizierte Gruppe enthält, die selbst einen Quantor enthält, schreibe es um – meist leistet eine einzelne Zeichenklasse mit einem Quantor denselben Job in linearer Zeit. Und wenn ein Muster länger als eine oder zwei Zeilen wird, ist die ehrliche Antwort oft, dass ein echter Parser das richtige Werkzeug ist und der Regex nicht.

Intern gebaut. Die Syntax-Tabelle zielt auf den JavaScript (ECMAScript) reguläre-Ausdrücke-Geschmack ab und läuft vollständig in deinem Browser.

Häufig gestellte Fragen

Welchen Regex-Geschmack beschreiben diese Tokens?
Den JavaScript (ECMAScript)-Geschmack, der in Browsern, Node.js und den meisten Frontend-Werkzeugen läuft. Die Kern-Syntax wird mit PCRE, Python und Java geteilt, sodass die überwältigende Mehrheit dieser Tokens direkt übertragbar ist, aber prüfe Lookbehind und Unicode-Eigenschafts-Escapes, wenn du auf eine andere Engine zielst.
Warum matcht mein Muster mehr, als ich erwartet habe?
Fast immer, weil ein Quantor gierig ist. Sowohl * als auch + nehmen so viel wie möglich und geben Zeichen nur zurück, wenn der Rest des Musters fehlschlägt. Füge ? hinzu, um sie faul zu machen, wie in .+?, oder ersetze den Wildcard durch eine negierte Klasse wie [^>]+, was sowohl präziser als auch schneller ist.
Was ist der Unterschied zwischen einer erfassenden und einer nicht-erfassenden Gruppe?
(abc) speichert, was es gematcht hat, sodass du später mit \1 darauf verweisen oder es aus dem Ergebnis-Array lesen kannst. (?:abc) gruppiert die Tokens für Quantoren oder Alternation, ohne etwas zu speichern. Verwende die nicht-erfassende Form, wenn du nur die Gruppierung brauchst; sie hält die Ergebnis-Indizes stabil und reduziert den Aufwand leicht.
Warum matcht \w keine akzentuierten oder chinesischen Zeichen?
In JavaScript ist \w als [A-Za-z0-9_] definiert und bewusst nur ASCII. Um Buchstaben aus beliebigen Schriften zu matchen, verwende ein Unicode-Eigenschafts-Escape mit dem u-Flag: /\p{L}+/u matcht Buchstaben in Latein, Kyrillisch, Griechisch, Han, Kana und jeder anderen Schrift.
Kann ein regulärer Ausdruck ein Sicherheitsrisiko sein?
Ja. Verschachtelte Quantoren wie (a+)+b können katastrophales Backtracking auslösen, bei dem die Engine exponentiell viele Möglichkeiten erkundet, bevor sie fehlschlägt. Wenn ein solches Muster auf Nutzereingaben angewendet wird, kann ein kurzer präparierter String den Prozess einfrieren. Schreibe verschachtelte Quantoren nach Möglichkeit in eine einzelne Zeichenklasse um.
Sollte ich einen Regex verwenden, um HTML oder JSON zu parsen?
Nein. Beide sind rekursive Formate, und reguläre Ausdrücke können keine beliebige Verschachtelung ausdrücken. Verwende einen echten Parser: DOMParser für HTML, JSON.parse für JSON. Reguläre Ausdrücke sind das richtige Werkzeug, um flachen Text zu scannen, einfache Feldformate zu validieren und gezieltes Suchen-und-Ersetzen durchzuführen.