Skip to main content

Regex Tester

Test regular expressions with live highlighting, matches and capture groups.

Geprüft von · Zuletzt geprüft

//g

Den Regex-Tester verwenden

  1. Das Muster in das Muster-Feld eingeben ohne umgebende Schrägstriche. Gib zum Beispiel \\b\\d{3}-\\d{4}\\b ein, nicht /\\b\\d{3}-\\d{4}\\b/g.
  2. Die benötigten Flags umschalten aus der Kontrollkästchen-Zeile: g für alle Treffer, i für Groß-/Kleinschreibung-ignorierend, m für mehrzeilige Anker, s für Punkt-passt-Zeilenumbruch, u für Unicode, y für Sticky.
  3. Den Testtext in den großen Testbereich einfügen. Der Hervorheber läuft bei jedem Tastendruck, sodass du sofortiges Feedback erhältst.
  4. Die Trefferliste unterhalb des Textbereichs prüfen. Jeder Eintrag zeigt den Trefferindex, die gematchte Teilzeichenkette und alle nummerierten oder benannten Capture-Gruppen.
  5. Den Spickzettel öffnen, wenn du eine Erinnerung an die Quantifizierer-Syntax, Anker, Zeichenklassen oder Lookaround-Konstrukte benötigst.
  6. Ein Muster kopieren mit der Kopierschaltfläche, wenn du es als Literal oder new RegExp() in deinen Code einfügen möchtest.

Im Inneren

Dein Muster wird via new RegExp(pattern, flags) kompiliert, das es an dieselbe Engine übergibt, die dein JavaScript-Code zur Laufzeit verwendet - V8s Irregexp in Chrome und Node, SpiderMonkeys Regexp-Engine in Firefox oder JavaScriptCores YARR in Safari. Beim Tippen fängt ein try/catch-Block SyntaxError ab und zeigt ihn inline an, statt zu werfen. Das Matching verwendet String.prototype.matchAll, sodass du die vollständige Liste der Treffer zusammen mit Gruppen, Indizes und Eingabelänge erhältst, ohne den Regex in einer Schleife ausführen zu müssen. Der Hervorheber durchläuft das Treffer-Array einmal und fügt <mark>-Spans über einen sicheren Textknoten-Ansatz in den DOM ein, sodass Sonderzeichen in deinem Testtext niemals als HTML behandelt werden.

Wann du es verwenden würdest

  • Ein Validierungsmuster für eine E-Mail-, Telefon- oder Rechnungsnummer entwerfen, bevor du es in dein Zod-, Joi- oder Yup-Schema einfügst.
  • Einen Regex debuggen, der in deiner IDE funktioniert, aber sich in der Produktion wegen eines subtilen Flag-Mismatches anders verhält.
  • Strukturierte Daten aus Protokollzeilen extrahieren - Zeitstempel, IPs, Anfrage-IDs - und verifizieren, dass die Capture-Gruppen dort landen, wo du sie erwartest.
  • Jemandem den Unterschied zwischen gierigen und faulen Quantifizierern beibringen, indem .* gegenüber .*? über dieselbe Eingabe umgeschaltet wird.
  • Einen grep -E-Befehl in einen JavaScript-Regex konvertieren und bestätigen, dass die Semantik die Übersetzung überlebt.

Häufige Fallstricke und Sonderfälle

  • ECMAScript ist nicht PCRE. Muster, die auf possessiven Quantifizierern, Subroutinen-Aufrufen oder bedingten Gruppen basieren, werden nicht kompiliert; diese kommen aus PCRE/Perl und haben kein ECMAScript-Äquivalent.
  • Lookbehind-Unterstützung. Variabel langen Lookbehind wie (?<=foo.*) wird in modernem V8, SpiderMonkey und JavaScriptCore unterstützt, schlägt aber in älteren Safari-Builds fehl. Wenn du Pre-2020-Browser anvisierst, vermeide es.
  • Unicode-Property-Escapes wie \\p{L} funktionieren nur, wenn das u-Flag gesetzt ist. Es zu vergessen führt zu einem Invalid-Escape-Fehler.
  • Surrogate-Paare. Ohne das u-Flag sind einzelne Emojis zwei Code-Einheiten und . passt nur auf die erste Hälfte.
  • Das globale Flag und lastIndex. Dasselbe RegExp-Objekt mit g und .test() wiederzuverwenden, schreitet lastIndex zwischen Aufrufen voran, was eine klassische Quelle von "Warum wechselt mein Validator zwischen true/false"-Fehlern ist.
  • Katastrophales Zurückverfolgen. Muster wie (a+)+$ gegen lange nicht-passende Eingaben können den Tab einfrieren. Wenn der Hervorheber hängen bleibt, ist dein Muster mit hoher Wahrscheinlichkeit quadratisch oder schlechter.

Regex-Syntax im Hintergrund

Die ECMAScript-Grammatik für reguläre Ausdrücke ist in Anhang B und Abschnitt 22.2 des ECMA-262-Standards spezifiziert. Sie lehnt sich stark an Perl und PCRE an, weicht aber an einigen Stellen ab: keine eingebetteten Modifikatoren mit (?i), keine benannten atomaren Gruppen, begrenzte Unicode-Unterstützung ohne das u-Flag und unterschiedliche Semantik für $ am Ende einer Zeichenkette, wenn m deaktiviert ist. Andere Regex-Flavors im allgemeinen Einsatz umfassen PCRE (PHP, nginx), Pythons re- und regex-Module, Gos RE2 (lineare Zeit, kein Zurückverfolgen) und POSIX ERE, wie es von grep -E implementiert wird. RE2 verdient besondere Erwähnung: Es lehnt Backreferences und Lookaround ab, garantiert aber lineare Matching-Zeit, weshalb Google es für benutzerseitig bereitgestellte Muster verwendet.

Vergleich mit Alternativen

Für komplexe Test-Suites, die mit deiner Codebasis versioniert werden müssen, bietet regex101.com Permalinks und einen per-Muster-Debugger, der jeden Token schrittweise durchläuft - extrem nützlich, wenn du wirklich feststeckst. grep -P, ripgrep und sed -E sind nach wie vor die schnellste Methode, eine große Codebasis vom Terminal aus zu durchsuchen, und die Rust-Regex-Engine von ripgrep ist PCRE-kompatibel, läuft aber in garantierter linearer Zeit. Das Find-in-Files deiner IDE ist perfekt, wenn du einen Regex mit Kontext koppeln und über viele Dateien ersetzen möchtest. Verwende diesen Web-Tester, wenn du ein ECMAScript-spezifisches Muster festlegen, nichts installieren und Capture-Gruppen pro Treffer auf einen Blick sehen möchtest - besonders weil die Engine hier genau die ist, die dein Node.js-Dienst oder Browser-Code verwenden wird.

Häufig gestellte Fragen

Ist das dieselbe Regex-Engine wie in meinem Node.js-Dienst?

Wenn deine Node.js-Runtime auf V8 basiert (was bei allen gängigen Node-Builds der Fall ist), dann ja - die Engine ist Irregexp, dieselbe, die diese Seite verwendet, wenn du Chrome benutzt. Safari und Firefox verwenden verschiedene Engines mit nahezu identischer Semantik für gängige Muster, sodass hier getestete Muster auf jede moderne JS-Runtime portierbar sind. Unterschiede zeigen sich an den Rändern: Lookbehind-Unterstützung, Unicode-Property-Escapes und das noch nicht universell verfügbare v-Flag (RegExp v).

Warum passt mein Muster in regex101, aber nicht hier?

regex101 ist standardmäßig auf PCRE2 (im PCRE2-Tab) eingestellt, das Features unterstützt, die ECMAScript fehlen: possessive Quantifizierer, atomare Gruppen, bedingte Muster, Rekursion und Inline-Modifikatoren wie (?i). Wechsle in regex101 zum ECMAScript/JavaScript-Flavor, um das Verhalten dieses Testers zu reproduzieren. Das Umgekehrte passiert ebenfalls: ECMAScript erfordert das u-Flag für \p{Letter} und ähnliche Property-Escapes, während PCRE sie als immer verfügbar behandelt.

Verlässt mein Muster oder meine Testzeichenkette den Browser?

Nein. Der RegExp-Konstruktor ist synchron und lebt vollständig in der V8-, SpiderMonkey- oder JavaScriptCore-Engine, die in deinem Browser eingebettet ist. Kein Fetch-Request sendet dein Muster irgendwohin, kein WebSocket ist geöffnet, und es gibt keinen Analytics-Hook, der deinen Testtext empfängt. Du kannst nach dem Laden der Seite das Netzwerk deaktivieren und der Tester funktioniert weiterhin, was der einfachste Weg ist, die lokale Verarbeitung zu beweisen.

Wie referenziere ich eine Capture-Gruppe in der Ersetzung?

In einer Ersetzungszeichenkette referenziere nummerierte Gruppen mit Dollarzeichen-Nummer, zum Beispiel $1 für die erste Gruppe, $2 für die zweite. Benannte Gruppen verwenden die Form $&lt;name&gt;. Der gesamte Treffer ist $&amp;, der Text vor dem Treffer ist $`, und der Text danach ist $'. In einer Ersetzungsfunktion (String.prototype.replace mit einem Callback) erhältst du Gruppen als positionelle Argumente und das benannte Gruppen-Objekt als letztes Argument.

Warum passt .* manchmal zu wenig oder zu viel?

Das Punkt-Metazeichen passt standardmäßig nicht auf Zeilenumbrüche. Bei mehrzeiligen Eingaben stoppt es bei jedem \n, was aussehen kann, als ob es zu wenig passt. Füge das s-Flag (dotAll) hinzu, damit . auch Zeilenumbrüche überquert. Umgekehrt ist .* gierig und konsumiert so viel wie möglich, bevor es zurücktrackt; wechsle zu .*? für ein faules Matching, das beim ersten Treffer stoppt. Die Kombination von s mit einem gierigen .* über ein ganzes Dokument ist eine bekannte Leistungsfalle.

Was macht das u-Flag tatsächlich?

Das Setzen des u-Flags schaltet das Muster in den Unicode-Modus gemäß ECMAScript um. Drei Dinge ändern sich: . passt auf einen Unicode-Code-Punkt statt einer UTF-16-Code-Einheit, sodass Emojis und Zeichen der supplementären Ebene als eines passen; \p{Script=Cyrillic} und ähnliche Property-Escapes werden verfügbar; und Escape-Sequenzen, die keinem definierten Escape entsprechen, werfen einen SyntaxError statt das Literal-Zeichen stillschweigend zu matchen. Für jede moderne internationalisierte Eingabe setze immer u.

Kann ich das verwenden, um einen JSON- oder HTML-Parser zu bauen?

Du kannst, aber du solltest es nicht. JSON ist kontextfrei (verschachtelte geschweifte Klammern und eckige Klammern) und HTML ist noch komplexer; Regex ist im Chomsky-Sinne eine reguläre Sprache und kann rekursive Strukturen nicht korrekt balancieren. Du bekommst etwas, das auf deiner Stichprobe funktioniert und bei Real-World-Eingaben versagt. Für JSON verwende JSON.parse; für HTML verwende DOMParser oder einen geeigneten Parser wie parse5. Regex ist das richtige Tool zum Scannen flacher Muster innerhalb bereits tokenisierter Eingaben.

Wie erkenne ich, ob mein Regex katastrophal zurücktracken wird?

Suche nach verschachtelten Quantifizierern, bei denen das innere Muster sich überschneidet, wie (a+)+, (a|a)+ oder (a*)*, gefolgt von etwas, das am Ende scheitern kann. Bei einer langen Eingabe von a-Zeichen, gefolgt von einem nicht-passenden Abschlusszeichen, erkundet die Engine exponentiell viele Möglichkeiten, die a's aufzuteilen. Schreibe mit einem einzigen Quantifizierer um oder verwende atomare Gruppen in Flavors, die sie unterstützen. RE2 und ripgrep vermeiden das Problem völlig, indem sie Backreferences und Lookaround ablehnen.

Ist der Sticky-Modus in echtem Code nützlich?

Ja, wenn du einen Tokenizer oder Lexer schreibst. Das Setzen des y-Flags lässt den Regex nur am genauen lastIndex passen, sodass du durch eine Zeichenkette einen Token nach dem anderen vorgehen kannst, ohne vorwärts zu suchen. Babel, TypeScript und Prettier verwenden alle Sticky-Modus-Regex in ihren Lexern. Für einmalige Validierung oder Extraktion bleibe bei g oder ohne Flag.

Wie schreibe ich einen mehrzeiligen Regex, der noch lesbar ist?

ECMAScript hat kein erweitertes x-Flag von PCRE, sodass du keine Kommentare und Leerzeichen innerhalb eines Muster-Literals einbetten kannst. Baue das Muster stattdessen programmgesteuert aus Tagged Templates oder verketteten Zeichenketten und übergib das Ergebnis an new RegExp. Bibliotheken wie XRegExp fügen benannte Gruppen, freies Leerzeichen und Inline-Kommentare auf der nativen Engine hinzu, wenn du sie benötigst.

Mehr Developer Tools