Engineering · 23. September 2026

Regular-Expression-Tests — wie Sie ein Regex prüfen und debuggen, bevor es live geht

Ein Regex, der auf dem Beispiel im Kopf funktioniert, kann an echten Daten scheitern. Ein praktischer Workflow zum Testen von Mustern im Browser: Flags, Capture-Gruppen, katastrophales Backtracking und lesbare Muster.

Die meisten Fehler bei regulären Ausdrücken sind keine Syntaxfehler. Ein Muster kann vollkommen gültig sein und trotzdem falsch: Es passt zu viel, zu wenig oder — im schlimmsten Fall — blockiert die Seite, wenn es auf einen feindlichen String trifft. Zwischen einem Muster, das auf den Beispielen im Kopf funktioniert, und einem, das mit echten Daten zurechtkommt, liegt das Testen.

Dieser Beitrag beschreibt einen praktischen Workflow zum Schreiben, Testen und Debuggen regulärer Ausdrücke im Browser — plus die Fehlerbilder, die am häufigsten zubeißen.

Mit echten Daten testen, nicht mit Spielzeug-Beispielen

Spielzeug-Strings schmeicheln einem Muster. Echte Eingaben enthalten Zeilenumbrüche, die Sie vergessen haben, nachgestellte Leerzeichen, Emoji, leere Werte und vierzig Kilobyte kopierten Markup.

  • Fügen Sie die schlechteste echte Probe ein — idealerweise die, die schon etwas zum Absturz gebracht hat.
  • Testen Sie den leeren String, ein einzelnes Zeichen und eine sehr lange Zeile.
  • Testen Sie Nicht-ASCII-Text, wenn die Eingabe ihn enthalten kann: Ü, 日本語, 🙂.
  • Prüfen Sie die Trefferanzahl, nicht nur den ersten Treffer. Off-by-one-Quantifizierende und gierige Überlappungen zeigen sich erst hier.

Live-Highlighting beim Testen macht das günstig: Jede Trefferposition aktualisiert sich, während Sie das Muster ändern, statt drei Tage später in einer Logdatei aufzutauchen.

Flags ändern die Bedeutung eines Musters

Derselbe Ausdruck verhält sich je nach Flags völlig anders:

Flag Wirkung Typische Überraschung
i Groß-/Kleinschreibung ignorieren passt auch auf Bezeichner, die Sie unterscheiden wollten
g global — alle Treffer finden in JavaScript merken sich test() und exec() Zustand zwischen Aufrufen
m multiline — ^ und $ pro Zeile ^ bedeutet nicht mehr „Anfang des Strings"
s Punkt trifft auch Zeilenumbruch .* überschreitet plötzlich Zeilengrenzen
u Unicode-Modus für Code-Punkt-Escapes erforderlich

Das JavaScript-Flag g verdient besondere Erwähnung: Damit erhöht regex.test() lastIndex, sodass wiederholte Aufrufe desselben Objekts unterschiedliche Antworten liefern. Das ist eine klassische Quelle für „funktioniert einmal, scheitert beim Wiederholen".

Capture-Gruppen und benannte Gruppen

Gruppen extrahieren Daten, kosten aber auch Speicher und machen Muster schwerer lesbar.

// benannte Gruppen überleben das Umordnen, nummerierte nicht
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const m = "2026-09-22".match(re);
m.groups.year;  // "2026"
m.groups.month; // "09"

Bevorzugen Sie benannte Gruppen gegenüber nummerierten, damit ein Umbau des Musters Ihre Referenzen nicht still verschiebt. Wenn Sie Klammern nur zum Gruppieren und nicht zum Erfassen brauchen, nutzen Sie eine nicht erfassende Gruppe: (?:...).

Katastrophales Backtracking

Verschachtelte Quantifizierende wie (a+)+$ oder (\s*)* können eine Engine in exponentielle Laufzeit schicken — bei Strings, die fast passen. Das Muster ist bei guter Eingabe sofort fertig und hängt bei einer feindlichen, und genau eine solche schickt ein Angreifer.

  • Vermeiden Sie Quantifizierende über Gruppen, die selbst Quantifizierende enthalten.
  • Ankern Sie, wo es geht. ^ und $ lassen die Engine früh verwerfen.
  • Stressen Sie mit einem langen Fast-Nicht-Treffer. Wenn die Laufzeit mit jedem zusätzlichen Zeichen stark steigt, ist das Muster unsicher.
  • Erwägen Sie eine Engine in linearer Zeit (RE2-Stil) für nicht vertrauenswürdige Eingaben auf einem Server.

Muster lesbar halten

  • Nennen Sie das Muster im Code — const ISO_DATE = /.../ ist besser als ein anonymes Literal in sechs Dateien.
  • Nutzen Sie den Free-Spacing-Modus (x), falls die Engine ihn unterstützt, um Kommentare und Leerzeichen im Muster unterzubringen.
  • Seien Sie explizit bei Ziffern. [0-9] meint ASCII-Ziffern; \d trifft im Unicode-Modus auch andere Schriften.
  • Hinterlassen Sie zwei Beispiele beim Muster: eines, das passen muss, und eines, das nicht passen darf.

Ein praktischer Workflow

Schritt Was Sie prüfen
1. Schreiben Sie das kleinste Muster, das eine echte Probe trifft das Highlight landet dort, wo Sie es erwarten
2. Fügen Sie negative Proben hinzu keine Treffer bei Eingaben, die scheitern müssen
3. Schalten Sie Flags bewusst ein jedes Flag hat einen Grund
4. Stressen Sie mit langen und feindlichen Eingaben der Treffer entsteht sofort
5. Konvertieren Sie den Code mit benannten Gruppen keine positionsabhängigen Referenzen bleiben

Ausprobieren

Öffnen Sie einen Regex-Tester, fügen Sie Muster und echte Probe ein und beobachten Sie, wie jeder Treffer beim Tippen hervorgehoben wird. Weil der Test in Ihrem Browser läuft, verlässt der Text, den Sie prüfen, niemals Ihr Gerät — und das ist genau dann wichtig, wenn die Probe ein Token, einen Schlüssel oder Kundendaten enthält.