Reguläre Ausdrücke testen, ohne den Tab zu riskieren
Muster oben eintippen, Testtext einfügen, Treffer sofort hervorgehoben sehen: mit nummerierten und benannten Gruppen je Treffer, einer Ersetzen-Vorschau für $1 und $<name> und einer Erklärung jedes Bestandteils. Die Auswertung läuft in deinem Browser, in einem eigenen Rechenthread mit harter Zeitgrenze. Kein Upload, keine Anmeldung.
Warum friert ein Regex-Tester überhaupt ein?
Weil ein laufender regulärer Ausdruck sich in JavaScript nicht abbrechen lässt. Das Muster (a+)+b sieht harmlos aus, zwingt die Engine auf 30 Zeichen aber zu Milliarden von Rückschritten, weil sie jede mögliche Aufteilung der a durchprobiert, bevor sie aufgibt. Solange sie rechnet, steht der ganze Thread: kein Klick, kein Scrollen, keine Fehlermeldung.
Der Fachbegriff dafür ist ReDoS (Regular Expression Denial of Service), und er ist keine Laborkuriosität. Am 2. Juli 2019 brachte ein einziger regulärer Ausdruck mit katastrophalem Backtracking in einer neuen Firewall-Regel das weltweite Netz von Cloudflare für 27 Minuten zum Erliegen; das Unternehmen hat den Vorfall selbst ausführlich dokumentiert. Wenn ein solches Muster ein Rechenzentrum lahmlegen kann, legt es einen Browser-Tab erst recht lahm.
Deshalb ist dieses Werkzeug so gebaut: Dein Muster läuft in einem Web Worker, also einem eigenen Thread. Der Haupt-Thread stellt gleichzeitig einen Wecker. Antwortet der Worker nicht rechtzeitig, wird er von außen beendet und für die nächste Anfrage ein frischer gestartet. Von innen wäre das unmöglich, und genau darin liegt der Unterschied zu einem Tester, der Fremdmuster einfach im Haupt-Thread ausführt.
Wie liest man Gruppen richtig?
Jede runde Klammer im Muster merkt sich, was sie getroffen hat. (\d{4}) ist Gruppe 1, die nächste Klammer Gruppe 2 und so weiter. Übersichtlicher wird es mit benannten Gruppen: (?<jahr>\d{4}) trägt ihren Zweck im Namen und überlebt jede spätere Umsortierung des Musters. Braucht eine Klammer nur die Gruppierung, aber kein Gedächtnis, schreibt man (?:…); das spart Arbeit und hält die Nummerierung sauber.
Die Trefferliste zeigt beides nebeneinander. Wichtig ist die Unterscheidung zwischen nicht beteiligt und leer: In (a)|(b) bleibt bei einem Treffer auf b die erste Gruppe unbeteiligt, sie hat also keinen Wert. Eine Gruppe wie (x*) kann dagegen sehr wohl beteiligt sein und trotzdem leeren Text enthalten. Wer das verwechselt, baut sich beim Ersetzen still falsche Ergebnisse.
Was tun $1 und $<name> beim Ersetzen?
Im Ersetzen-Feld gelten dieselben Regeln wie bei String.prototype.replace:
$1bis$99setzen den Inhalt der nummerierten Gruppe ein$<name>den Inhalt der benannten Gruppe$&den ganzen Treffer,$`den Text davor,$'den danach$$ein einzelnes Dollarzeichen
Aus 24.12.2026 wird mit der Vorlage $<jahr>-$<monat>-$<tag> also 2026-12-24. Die Vorschau rechnet dabei auf den bereits gefundenen Treffern, führt das Muster also kein zweites Mal aus. Das ist kein Detail: Ein zweiter Lauf im Haupt-Thread wäre genau die Stelle, an der die Seite doch noch einfriert.
Warum gibt es keine perfekte E-Mail-Regex?
RFC 5322 erlaubt zitierte Bestandteile, Kommentare in Klammern und verschachtelte Konstrukte. Ein vollständig konformer Ausdruck ist deshalb tausende Zeichen lang, kaum lesbar und sagt trotzdem nichts darüber aus, ob hinter der Adresse ein Postfach steht. Der HTML-Standard löst das Problem, indem er ein eigenes, bewusst einfacheres Muster für input type="email" festlegt und diese Vereinfachung ausdrücklich als absichtliche Abweichung von RFC 5322 bezeichnet.
Das Muster in der Bibliothek folgt derselben Linie: Es fängt Tippfehler ab, mehr verspricht es nicht. Wer Adressen wirklich prüfen will, verschickt eine Bestätigungsmail; alles andere ist Kosmetik. Genauso bei der IBAN: Die Länge ist je Land verschieden (nach ISO 13616 zwischen 15 und 34 Zeichen, in Deutschland 22), und die eigentliche Prüfziffer ist eine Modulo-97-Rechnung, die kein regulärer Ausdruck leisten kann. Ein Muster prüft die Form, nie den Inhalt.
Wo unterscheiden sich Muster zwischen Browsern?
Benannte Gruppen und die Rückschau (?<=…) kamen mit ES2018 in die Sprache, aber nicht überall gleichzeitig an: Safari unterstützt die Rückschau erst ab Version 16.4 (März 2023). Ein Muster, das in Chrome sauber läuft, kann auf einem älteren iPhone einen Syntaxfehler auslösen. Wenn dein Ausdruck später im Browser eines Kunden landen soll, lohnt sich hier ein Blick, bevor er in den Code wandert.
Ehrliche Grenzen
Ausgewertet werden bis zu 100.000 Zeichen Testtext und 1.000 Treffer; der Worker gibt nach einer Sekunde Rechenzeit auf, der Wecker im Haupt-Thread nach 2,5 Sekunden. Die Trefferliste zeigt die ersten 100 Einträge ausführlich, hervorgehoben werden weiterhin alle. Für ganze Logdateien ist ein Kommandozeilen-Werkzeug wie ripgrep das passendere Instrument. Und für die häufigste Falle gibt es keine Grenze, sondern nur Aufmerksamkeit: Verschachtelte Wiederholungen wie (a+)+ oder (\w+\s?)* sind der Bauplan für ein Muster, das im Ernstfall nicht mehr zurückkommt.