BrowserTools
Startseite / Validatoren / Regex-Tester und -Debugger

Regex-Tester und -Debugger

Teste JavaScript-Reguläre-Ausdrücke live mit Treffer-Hervorhebung, Erfassungsgruppen und Ersetzungsvorschau.

Regex-Tester und -Debugger wird geladen… Wenn nichts passiert, aktiviere JavaScript.

Reguläre Ausdrücke (regex oder regexp) sind eine formale Sprache zur Beschreibung von Mustern in Text. Die Theorie geht auf den Mathematiker Stephen Cole Kleene zurück, der 1956 die Algebra der regulären Sprachen formalisierte, sowie auf Ken Thompson, der regex in den 1960er- und 1970er-Jahren im QED-Editor und in den ursprünglichen Unix-Werkzeugen grep, sed und awk implementierte. Moderne regex-Engines erweitern die theoretische Grundlage um praktische Funktionen wie Lookaheads, Rückwärtsverweise (Backreferences) und benannte Erfassungsgruppen, was sie zu einem der mächtigsten Textverarbeitungswerkzeuge macht, die in irgendeiner Programmiersprache verfügbar sind.

Beispiele

Eingabe \b\w+@\w+\.\w+\b on "a@b.com x@y.org"
Ausgabe 2 matches: a@b.com, x@y.org

Erfassungsgruppen und Flags (g, i, m) werden live angezeigt, während du tippst.

Häufig gestellte Fragen

Wird meine Eingabe an einen Server gesendet?
Nein. Der reguläre Ausdruck wird vollständig in deinem Browser mit der nativen JavaScript-RegExp-Engine ausgewertet. Dein Muster, deine Testzeichenkette und jede Ersetzungsvorlage verlassen niemals dein Gerät und werden niemals über das Netzwerk übertragen.
Welche regex-Variante verwendet dieses Werkzeug?
Dieses Werkzeug verwendet die JavaScript-regex-Engine (ECMAScript) über den nativen RegExp-Konstruktor. Es unterstützt alle Standardfunktionen von ES2024, einschließlich benannter Erfassungsgruppen (?<name>...), Lookbehind-Assertions ((?<=...) und (?<!...)), des dotAll-Flags (s), des Unicode-Flags (u), des Indizes-Flags (d) und des kürzlich hinzugefügten v-Flags für die Unicode-Mengennotation. Es unterstützt keine PCRE-spezifischen Funktionen wie rekursive Muster oder possessive Quantoren.
Wann sollte ich eine regex statt einfacher String-Methoden verwenden?
Für einfache Suchen nach festen Zeichenketten ist String.prototype.includes() oder indexOf() schneller und lesbarer als eine regex. Greife zu einer regex, wenn du Mustervergleich brauchst (z. B. „beginnt mit einer Ziffer“), Alternation (auf 'cat' oder 'dog' passen), Zeichenklassen (auf jeden Vokal passen), Quantoren (auf eine oder mehrere Ziffern passen) oder Erfassungsgruppen, um Teiltreffer zu extrahieren. regex glänzt bei Validierungs-, Extraktions- und Transformationsaufgaben, bei denen das Zielmuster eine Struktur hat, die sich nicht als eine einzelne wörtliche Zeichenkette ausdrücken lässt.
Wie unterscheidet sich JavaScript-regex von PCRE (Python, PHP, Perl)?
Die regex-Variante von JavaScript ähnelt PCRE, weist aber einige bemerkenswerte Unterschiede auf. JavaScript unterstützt keine atomaren Gruppen, possessiven Quantoren oder rekursiven Muster. Die in PCRE verfügbare \K-Assertion (keep) fehlt in JavaScript. Benannte Erfassungsgruppen verwenden in JavaScript die Syntax (?<name>...) statt (?P<name>...) in Python. Das globale Flag (g) in JavaScript wirkt sich auf die zustandsbehaftete Eigenschaft lastIndex des RegExp-Objekts aus, was zu subtilen Fehlern führen kann, wenn ein regex-Objekt in einer Schleife wiederverwendet wird.
Welche Flags gibt es und was bewirken sie?
Die wichtigsten regex-Flags von JavaScript sind: g (global), alle Treffer finden, statt beim ersten zu stoppen; i (Groß-/Kleinschreibung ignorieren), Groß- und Kleinbuchstaben als gleichwertig behandeln; m (Multiline), ^ und $ an Zeilengrenzen statt an Zeichenkettengrenzen passen lassen; s (dotAll), den Punkt (.) auf Zeilenumbrüche passen lassen; u (Unicode), die vollständige Unicode-Übereinstimmung und Codepunkt-Escapes aktivieren; und d (Indizes), Start- und Endindizes für jeden Treffer und jede Erfassungsgruppe im Ergebnis einschließen.
Gibt es eine Begrenzung, wie lang die Testzeichenkette oder das Muster sein darf?
Es gibt keine vom Werkzeug erzwungene harte Grenze, aber sehr lange Muster oder sehr große Testzeichenketten können dazu führen, dass der Browser nicht mehr reagiert, besonders wenn das Muster verschachtelte Quantoren enthält, die katastrophales Backtracking auslösen können. Muster mit unbegrenztem Backtracking können bei großen Eingaben unbegrenzt CPU verbrauchen. Wenn der Browser-Tab einfriert, schließe ihn und öffne ihn erneut. Für den Produktiveinsatz teste regex-Muster immer gegen feindselige Eingaben, bevor du sie bereitstellst.
Kann ich damit ein Ersetzungsmuster testen?
Ja. Gib eine Ersetzungszeichenkette in das Ersetzungsfeld ein, und das Werkzeug zeigt eine Live-Vorschau der Ausgabe nach Anwendung von String.prototype.replace (für den ersten Treffer) oder replaceAll (mit dem g-Flag). Die Standard-Ersetzungssyntax wird unterstützt: $1 und $2 für nummerierte Erfassungsgruppen, $<name> für benannte Erfassungsgruppen, $& für die gesamte übereinstimmende Zeichenkette, $` für den Text vor dem Treffer und $' für den Text nach dem Treffer.
Was ist katastrophales Backtracking und wie vermeide ich es?
Katastrophales Backtracking tritt auf, wenn eine regex-Engine bei einer Zeichenkette, die nicht zum Muster passt, eine exponentielle Anzahl möglicher Übereinstimmungspfade durchläuft. Es entsteht typischerweise durch verschachtelte Quantoren über sich überschneidende Zeichenklassen, zum Beispiel (a+)+ bei einer langen Folge von 'a'-Zeichen, gefolgt von einem Zeichen, das nicht passen kann. Um es zu vermeiden: bevorzuge atomare Muster, verwende possessive Quantoren, falls verfügbar, vermeide Mehrdeutigkeit darin, worauf jeder Teil des Musters passen kann, und teste immer mit Eingaben, die zum Scheitern bestimmt sind, sowie mit solchen, die erfolgreich sein sollen.
Was ist der Unterschied zwischen einer erfassenden und einer nicht erfassenden Gruppe?
Eine erfassende Gruppe (...) passt auf das Muster innerhalb der Klammern und speichert den übereinstimmenden Text, sodass er später über $1, $2 oder Gruppenindizes referenziert werden kann. Eine nicht erfassende Gruppe (?:...) gruppiert das Muster zu Quantifizierungs- oder Alternationszwecken, ohne den Treffer zu speichern, was sie geringfügig effizienter macht. Benannte Gruppen (?<name>...) sind erfassende Gruppen, die statt über den Index über den Namen referenziert werden können ($<name> in Ersetzungen, match.groups.name im JavaScript-Code).
Was ist ein häufiger Anfängerfehler bei regulären Ausdrücken?
Einer der häufigsten Fehler ist, das Maskieren des Punkts (.) zu vergessen, wenn man einen wörtlichen Punkt meint. Der Punkt in einer regex passt auf jedes Zeichen (außer standardmäßig auf den Zeilenumbruch), sodass ein Muster wie 3.14 auch auf 3X14 oder 3-14 passt. Schreibe 3\.14, um auf einen wörtlichen Punkt zu passen. Ein weiterer häufiger Fehler ist das Weglassen des globalen Flags (g) und das Rätseln, warum nur der erste Treffer hervorgehoben wird. Eine dritte Falle ist das Verankern mit ^ und $ und die Überraschung, dass diese nur dann an Zeilengrenzen passen, wenn das Multiline-Flag (m) gesetzt ist.

Über Regex-Tester und -Debugger

Reguläre Ausdrücke sind für eine breite Palette realer Aufgaben unverzichtbar. Die Formularvalidierung, das Prüfen, ob eine E-Mail-Adresse, eine Telefonnummer oder eine Postleitzahl dem erwarteten Format entspricht, nutzt fast überall regex. Log-Parser extrahieren mithilfe von Erfassungsgruppen strukturierte Felder aus unstrukturierten Log-Zeilen. Code-Editoren und IDEs verwenden regex zum Suchen und Ersetzen in großen Codebasen. Sicherheitswerkzeuge nutzen regex, um Injection-Muster und das Abfließen sensibler Daten zu erkennen. Datentransformations-Pipelines verwenden regex, um uneinheitliche Formate zu normalisieren. Konfigurationen von Netzwerkgeräten werden mit regex geprüft. Ein regex-Muster interaktiv zu verstehen und zu debuggen ist weitaus schneller, als ein Skript wiederholt auszuführen.

Dieser Tester wertet JavaScript-Reguläre-Ausdrücke in Echtzeit gegen deine Eingabe aus und hebt jeden Treffer hervor, während du tippst. Er listet für jeden Treffer alle Erfassungsgruppen (nummeriert und benannt) auf, sodass du sofort siehst, was jede Gruppe erfasst hat. Ein Ersetzungsmodus erlaubt es dir, eine Ersetzungsvorlage einzugeben und das Ergebnis von String.prototype.replace oder replaceAll vorab anzuzeigen, mit Unterstützung für die Rückwärtsverweise $1, $2 und $<name>. Alles läuft vollständig in der JavaScript-Engine deines Browsers; deine Muster und dein Eingabetext werden niemals an einen Server gesendet.

Bei regex kann man sich notorisch leicht auf subtile Weise irren. Ein einzelner Punkt (.) entspricht in manchen Modi jedem Zeichen, einschließlich Zeilenumbrüchen, nicht nur einem wörtlichen Punkt. Gierige Quantoren (*, +) passen so viel wie möglich und erfassen oft mehr als beabsichtigt; verwende die genügsamen Versionen (*?, +?), um so wenig wie möglich zu passen. Die Anker ^ und $ entsprechen standardmäßig dem Anfang und Ende der gesamten Zeichenkette; füge das Multiline-Flag (m) hinzu, wenn sie an Zeilengrenzen passen sollen. Katastrophales Backtracking, bei dem ein schlecht geschriebener regex bei einer feindseligen Eingabe eine exponentielle Übereinstimmungszeit verursacht, ist ein reales Denial-of-Service-Risiko in Webanwendungen, die von Nutzern bereitgestellte Muster auf von Nutzern bereitgestellten Text anwenden.

Von der Theorie formaler Sprachen zu grep

Das Konzept der regulären Ausdrücke stammt aus der theoretischen Informatik. 1956 veröffentlichte der Mathematiker Stephen Cole Kleene eine Arbeit, die 'reguläre Ereignisse' beschrieb, Mengen von Zeichenketten, die sich durch einen endlichen Automaten beschreiben lassen, und führte die algebraische Notation ein, aus der die regex-Syntax werden sollte. Der Stern-Operator (*), der Kleene-Stern genannt wird, ist nach ihm benannt. Zu diesem Zeitpunkt waren reguläre Ausdrücke rein eine mathematische Abstraktion ohne Bezug zur Computerpraxis.

Der Sprung von der Theorie zum Werkzeug kam 1968, als Ken Thompson die regex-Suche im Texteditor QED und dann im Unix-Werkzeug grep implementierte (dessen Name für 'globally search a regular expression and print' steht). Thompsons entscheidende Neuerung war ein effizienter Algorithmus, der einen regulären Ausdruck in einen nichtdeterministischen endlichen Automaten (NFA) umwandelte und ihn simulierte, was eine Übereinstimmung in linearer Zeit ohne katastrophales Backtracking garantierte. Viele moderne regex-Engines gaben Thompsons NFA-Ansatz zugunsten von Backtracking-Engines auf, die mehr Funktionen unterstützen (wie Rückwärtsverweise), aber im schlimmsten Fall exponentielles Verhalten zeigen können.

Heute werden reguläre Ausdrücke nativ in praktisch jeder Programmiersprache und jedem Texteditor unterstützt. Dennoch hat sich die Syntax in Dutzende inkompatibler Varianten aufgesplittert, POSIX BRE, POSIX ERE, PCRE, .NET, Java, Python, JavaScript, Ruby, jede mit subtilen Unterschieden in Syntax und Semantik. Eine für eine Sprache geschriebene regex funktioniert oft auch in einer anderen, aber Grenzfälle gibt es zuhauf. Diese Fragmentierung ist der Grund, warum es immer empfohlen wird, ein Muster in der konkreten Engine zu testen, die du tatsächlich verwenden wirst, bevor du es in der Produktion einsetzt.

Unterstützen