Regex-Tester

Muster eingeben und sofort sehen, was im Test-Text trifft – mit farbiger Hervorhebung direkt im Text, aufgeschlüsselten Gruppen daneben und einer Ersetzen-Vorschau. Wählbar zwischen den Flavors JavaScript, Java, PCRE und Python. ↓ Direkt zum Cheatsheet

Treffer

Ersetzen

Nutzt dieselbe Syntax wie String.replace(): $1, $2 … für nummerierte Gruppen, $<name> für benannte, $& für den ganzen Treffer.

Läuft in einem isolierten Web Worker mit Zeitlimit – nichts wird hochgeladen, und ein hängendes Muster blockiert nicht die Seite.

Regex-Flavors: JavaScript, Java, PCRE, Python

Ausgewertet wird immer mit der nativen RegExp-Engine deines Browsers – ein eigener Java- oder Python-Interpreter ließe sich in einer rein statischen Seite ohne Server nicht betreiben. Die Flavor-Auswahl passt daher an, was sich sinnvoll darstellen lässt: Bei Java, PCRE und Python entfällt das JS-spezifische g-Flag (dort wird ohnehin immer nach allen Treffern gesucht), gut definierte Unterschiede wie Pythons(?P<name>…)-Gruppen oder die Anker \A/\z werden automatisch ins JS-Äquivalent übersetzt. Für Konstrukte ohne JS-Entsprechung – possessive Quantifizierer, atomare Gruppen, POSIX-Klassen – erscheint stattdessen ein Warnhinweis statt eines stillen Fehlers.

Regex-Cheatsheet

Die wichtigsten Bausteine auf einen Blick – inklusive der Flavor-Unterschiede von oben:

Anker

^Anfang des Strings (oder der Zeile mit m-Flag)
$Ende des Strings (oder der Zeile mit m-Flag)
\bWortgrenze
\BKeine Wortgrenze

Zeichenklassen

.Ein beliebiges Zeichen außer Zeilenumbruch (mit s-Flag auch dieser)
\d / \DZiffer / keine Ziffer
\w / \WWortzeichen (a-z, A-Z, 0-9, _) / kein Wortzeichen
\s / \SLeerraum / kein Leerraum
[abc]Eines der Zeichen a, b oder c
[^abc]Keines der Zeichen a, b oder c
[a-z]Ein Zeichen im Bereich a bis z

Quantoren

*0 oder mehr
+1 oder mehr
?0 oder 1 (optional)
{n}Genau n-mal
{n,}Mindestens n-mal
{n,m}Zwischen n- und m-mal
*? +? ??Non-greedy: so wenig wie möglich statt so viel wie möglich

Gruppen & Rückverweise

(...)Fangende Gruppe (nummeriert)
(?:...)Nicht-fangende Gruppe
(?<name>...)Benannte fangende Gruppe
\1Rückverweis auf Gruppe 1
\k<name>Rückverweis auf die benannte Gruppe „name“
a|bAlternative: a oder b

Lookaround

(?=...)Positiver Lookahead: gefolgt von …
(?!...)Negativer Lookahead: nicht gefolgt von …
(?<=...)Positiver Lookbehind: vorangestellt von …
(?<!...)Negativer Lookbehind: nicht vorangestellt von …

Flavor-Unterschiede

(?P<name>...)Python-Syntax für benannte Gruppen (JS: (?<name>...)) – dieses Tool übersetzt sie automatisch.
\A \zJava/PCRE/Python-Anker für absoluten String-Anfang/-Ende – JS kennt sie nicht, sie werden automatisch ersetzt.
a++ (?>...)Possessive Quantifizierer und atomare Gruppen (Java/PCRE) – von der JS-Engine nicht unterstützt.
[:alpha:]POSIX-Zeichenklassen (PCRE) – dafür gibt es in JS kein Äquivalent.

Schutz vor catastrophic backtracking (ReDoS)

Verschachtelte Quantoren wie (a+)+b können eine Regex-Engine bei bestimmten Eingaben exponentiell viele Möglichkeiten durchprobieren lassen. Im Browser bedeutet das normalerweise: Der Tab friert ein, weil RegExp.exec() synchron läuft und sich von außen nicht unterbrechen lässt. Dieses Tool wertet deshalb in einem eigenen Web Worker aus – antwortet er nicht innerhalb von rund zwei Sekunden, wird er hart beendet und durch einen frischen ersetzt, mit einem Hinweis auf die vermutliche Ursache.

Häufige Fragen

Läuft mein Muster wirklich in Java, PCRE oder Python?
Nein, immer in der JS-Engine des Browsers – siehe oben. Die Flavor-Auswahl übersetzt gut definierte Unterschiede und warnt bei allem anderen, ersetzt aber keinen echten Interpreter.

Werden meine Eingaben hochgeladen?
Nein. Muster, Test-Text und Ersetzung bleiben ausschließlich im Browser, auch der Web Worker läuft ohne Netzwerkzugriff auf demselben Gerät.

Wie funktioniert der Ersetzen-Modus?
Wie String.prototype.replace(): $1, $2 … für nummerierte Gruppen, $<name> für benannte, $& für den ganzen Treffer. Bei Java/PCRE/Python werden immer alle Treffer ersetzt, bei JavaScript nur mit gesetztem g-Flag – das Tool zeigt an, welcher Fall gerade greift.

Warum stoppt die Trefferliste manchmal bei 5000?
Bewusste Obergrenze gegen Muster, die praktisch überall treffen und sonst unnötig Speicher verbrauchen würden – die allermeisten Muster erreichen sie nie.