Regex online testen: Praxisleitfaden zum Debuggen regulärer Ausdrücke

Regex online testen: Praxisleitfaden zum Debuggen regulärer Ausdrücke

Testen Sie eine JavaScript-Regex, prüfen Sie Capture-Gruppen und sehen Sie ein $1-Replace im Browser, bevor das Muster in Produktion landet.

26.09.2026
11 Min. Lektüre
Teilen Sie diesen Artikel:
Regex
Reguläre Ausdrücke
Validierung
tools-dev
Anleitung

Ein Muster, das richtig aussieht, verdient trotzdem eine Eingabe, die scheitert

Ein regulärer Ausdruck ist ein kleines Programm. Er ist schnell geschrieben, schnell aus einem Kommentar eingefügt und teuer, wenn er die falsche Zeichenkette akzeptiert oder den Tab einfriert. Der Regex-Tester führt die JavaScript-RegExp-Engine des Browsers auf einem Muster und einem Text aus, die Sie lokal einfügen — Treffer links hervorgehoben, Karten mit Gruppen rechts, optional eine Replace-Vorschau. Es gibt keinen Dialekt-Schalter: nicht PCRE, nicht Python, nicht die Engine einer Datenbank. Das ist dieselbe Familie wie Node und wie das Schlüsselwort pattern eines JSON Schema, das Ajv auswertet. Die Seite liegt im Hub der Entwickler-Utilities, neben Slugify und dem Case-Converter, für Aufgaben, die kein handgeschriebener Ausdruck sein sollten.

Nur JavaScript-Flags: g, i, m, s, u, y. Global (g) ist standardmäßig an und lässt sich abschalten
Der Match-Modus hebt Treffer hervor und listet Karten mit nummerierten Gruppen; eine benannte Gruppe erscheint einmal als GROUP k (Name)
Der Replace-Modus zeigt JavaScript-Ersetzungsmuster wie $1, $& und $<name>
Sechs eingebaute Beispiele und ein Spickzettel, der Tokens an der Einfügemarke einsetzt. „Probe laden“ füllt das Schlüssel=Wert-Beispiel und führt es aus
Nichts wird hochgeladen. Klicken Sie auf Prüfen — eine Änderung an Muster, Flags, Modus oder Text löscht das vorherige Ergebnis
Höchstens 500 Treffer werden zurückgegeben. Ein Sturm leerer Matches trifft einen Schleifenwächter. Verschachtelte Quantoren können den Tab trotzdem einfrieren

Wo der Tester hilft, und wo ein Unit-Test übernehmen sollte

Passende Einsätze für die Seite

Ein Muster, das Sie in Code, eine Fixture oder ein JSON-Schema-pattern einfügen wollen.

Einen Bug mit dem exakten Text aus dem Ticket nachstellen, einschließlich der Zeile, die nicht matchen darf
Gierig und lazy an zwei Wörtern in Anführungszeichen vergleichen, bevor Sie eine negierte Klasse wählen
Prüfen, dass ein JSON-Schema-pattern in JavaScript gültig ist, bevor Sie das Schema in Ajv kompilieren
Ein Replace mit $1 an einer kurzen Probe ansehen, dann das Muster in das Review kopieren
Eine Beispielkachel laden, wenn Sie einen bekannten Startpunkt brauchen statt eines leeren Felds
Was nicht in einen Regex-Spielplatz gehört

Manche Aufgaben haben schon ein Werkzeug, das die Regeln kennt. Ein handgeschriebener Ausdruck driftet.

URL-Slugs: Slugify (Trennzeichen, Schreibweise, Länge) statt eines Replace, den Sie pro Sprache nachjustieren
camelCase, snake_case, kebab-case: der Case-Converter. Eine Regex auf Wortgrenzen bricht an Ziffern und Akronymen
E-Mail, UUID oder date-time als Produktregel: ein Schema-Format oder ein eigener Parser, nicht die Kachel E-Mail (approx.)
Ein Muster, das stabil bleiben muss: neben den Fixtures im Repo committen. Der Tester legt Ihr Muster nicht in den Teilen-Link — der Button teilt die Werkzeugseite, nicht den aktuellen Ausdruck

Muster, die einen Blick überstehen und an echten Daten scheitern

Ein PCRE-Snippet in einer JavaScript-Box debuggen

Der Tester kompiliert das Feld mit new RegExp. Rekursive Konstrukte wie (?R) sind hier ungültig und zeigen die Fehlermeldung der Engine. Die Schrägstriche um das Feld sind nur die Oberfläche, nicht Teil des Musters. /(\w+)/gi einfügen entfernt die Begrenzer und mischt diese Flags mit den bereits aktiven — es ersetzt sie nicht. War g schon an, bleibt g an. Die zweite Falle ist der Backslash: Das Feld ist die Regex-Quelle, also bedeutet \d Ziffern. \\d aus einem JSON- oder Java-String sucht einen literalen Backslash gefolgt von d.

Ein nur in PCRE gültiges Muster aus einer Forumsantwort kopieren und dieselben Treffer erwarten
Die umgebenden Schrägstriche ins Feld tippen, sodass sie zu literalen Zeichen werden
Annehmen, ein eingefügtes /muster/flags ersetze die aktuellen Flags, statt sie zu mischen
Jeden Backslash verdoppeln, weil das Muster aus einem String-Literal im Quellcode stammt
Einen gierigen Quantor den Rest der Zeile schlucken lassen

Auf "one" and "two" liefert das Muster ".+" mit g einen Treffer: die ganze Spanne vom ersten bis zum letzten Anführungszeichen. Die Engine nimmt so viel sie kann und gibt Zeichen zurück, bis das letzte Anführungszeichen passt. Auf ".+?" zu wechseln heißt nicht „nur die gemeinten Wörter“. Mit g sind es zwei Treffer, "one" und "two". Lazy bedeutet der kürzeste Erfolg, kein semantischer Filter. "[^"]*" ist das Muster, das ein Anführungszeichen nicht überqueren kann.

.+ verwenden, obwohl das Stoppzeichen bekannt ist, und sich wundern, warum ein Treffer die Zeile gefressen hat
Einen lazy Quantor für einen Bedeutungsfilter halten
Vergessen, dass g jeden Erfolg findet, auch das zweite Wort in Anführungszeichen
Nur die bequeme Zeichenkette testen, die genau ein Paar enthält
Verschachtelte Quantoren auf einem langen Text

Eine Form wie (a+)+ gegen eine lange Folge von a, die das erwartete Ende nie erreicht, kann in katastrophales Backtracking kippen. Der Tester hat kein Server-Timeout. Er läuft auf dem Hauptthread des Tabs, die Seite kann einfrieren. Das Werkzeug deckelt die Rückgabe: Die globale Suche stoppt und zeigt eine Kürzungswarnung, entweder weil sie die weiche Grenze von 500 Treffern erreicht hat, oder weil ein Muster der Breite null den Schleifenwächter ausgelöst hat (die Engine rückt nach einem leeren Match um ein Zeichen vor, damit g nicht endlos läuft). Dieser Wächter macht einen verschachtelten Quantor nicht sicher. Der Upload akzeptiert .txt, .md und .log bis 32 MiB in die Testzeichenfolge, weiterhin lokal — ein volles Log plus ein verschachteltes Muster blockiert den Tab zuverlässig.

Ein Produktionslog in den Text legen, während das Muster noch verschachtelte Quantoren hat
Die Kürzungswarnung lesen als „das Muster stimmt, es gab nur zu viele Treffer“
\b auf einer langen Zeichenkette testen und hunderte leere Karten für Inhaltstreffer halten
Annehmen, der Browser beende einen ausufernden Ausdruck so, wie es ein CI-Job täte
Das E-Mail-Beispiel zum Validator befördern

Die Kachel „E-Mail (approx.)“ ist [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} auf [email protected] x not-an-email [email protected]. Mit g hebt sie [email protected] und [email protected] hervor. Das ist eine Demo, nicht RFC 5322, und die Seite sagt das. Dieselbe Ehrlichkeit gilt für Sticky: Das Flag y matcht hier nur am Anfang der Testzeichenfolge, weil lastIndex bei jedem Lauf zurückgesetzt wird. Es setzt nicht „dort fort, wo der letzte Treffer endete“. Und die Ergebnisse aktualisieren sich nicht während der Eingabe. Muster, Flags, Modus oder Text ändern löscht die Karten, bis Sie wieder auf Prüfen klicken.

Das ungefähre E-Mail-Muster als Formularvalidierung ausliefern
Erwarten, dass Flag y nach dem vorherigen Treffer weiterläuft
Das Muster ändern und die gerade verschwundenen Karten als Engine-Fehler lesen
g abschalten und sich wundern, dass eine Zeichenkette mit drei Daten nur eine Karte zeigt

Was jedes Flag und jeder Modus hier wirklich ändert

g, i, m, s, u, y

Sechs Flags, keine weiteren. Standard ist nur g.

g — global. Jeder nicht überlappende Treffer. Aus: nur der erste Treffer. matchAll in JavaScript verlangt ebenfalls g
i — Groß-/Kleinschreibung ignorieren. foo gegen FOO trifft nicht, bis i an ist
m — mehrzeilig. ^ und $ matchen an Zeilenrändern. Die Kachel ^\w+: auf „name: Ada“ plus „age: 36“ braucht g und m, um beide Labels zu treffen
s — dotAll. Der Punkt matcht Zeilenumbrüche. Ohne s scheitert ein Muster, das einen Umbruch überqueren muss, auch wenn der Text zusammenhängend wirkt
u — Unicode. Macht \p{L} zu einem Property-Escape, der Buchstaben matcht. Ohne u matcht dieselbe Quelle den literalen Text p{L}: sie kompiliert, und sie matcht nicht é
y — sticky, aber lastIndex wird bei jedem Lauf zurückgesetzt, der Treffer muss also bei Index 0 des Texts beginnen. Auf „ba“ matcht das Muster a mit y nichts; auf „ab“ matcht es das führende a und stoppt
Trefferkarten oder eine Replace-Vorschau

Match listet Treffer. Replace zeigt zusätzlich die ersetzte Zeichenkette, mit JavaScript-Ersetzungsmustern.

Match: jede Karte zeigt Index, Text und Gruppen. Ein leerer Treffer (Breite null) heißt (leer), er wird nicht ausgelassen
Hervorhebungen überlappen nicht: der erste Treffer gewinnt, spätere Überlappungen fehlen in der gezeichneten Zeichenkette
Replace: $1 ist Gruppe 1, $& der ganze Treffer, $<name> eine benannte Gruppe. Die Kachel (\w+)=(\d+) mit [$1=$2] auf a=1 b=2 wird zu [a=1] [b=2]
Der kürzere Fall aus der Doku, (\d+) ersetzt durch [$1] auf x=10, wird zu x=[10]. Die Ersetzung ist eine Vorschau, kein Datei-Rewrite
Nummerierte Gruppen, benannte Gruppen und die Grenze 500

Eine benannte Capture ist dieselbe Gruppe wie ihre Nummer. Die Karte zeigt sie einmal.

Die Datumskachel (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) auf „shipped 2024-03-15 ok“ ergibt GROUP 1 (year), GROUP 2 (month), GROUP 3 (day) — keine zweite Zeile ohne Namen
Die Paar-Kachel (\w+)=(\d+) auf „user=42 role=admin env=prod“ ergibt einen Treffer, user=42. role=admin sind keine Ziffern. Das Beispiel arbeitet wie geschrieben, das ist kein Bug
Die Ziffern-Kachel \d+ auf „order-1042 total=89“ ergibt 1042 und 89
Über 500 Treffer wird die Liste geschnitten und eine Warnung sagt, dass die Ergebnisse gekürzt wurden (weiches Limit oder Schleifenwächter). Die Warnung heißt: Muster oder Text enger fassen, nicht einen Teilscan für vollständig halten

Einen Fall ausführen, dann nur eine Variable ändern

Muster, Flags, Text, Prüfen

Im Regex-Tester läuft nichts, während Sie tippen. Die vorherigen Karten verschwinden, sobald sich die Eingaben ändern.

1

Die Quelle schreiben, kein Literal

Tippen Sie \d+, nicht /\d+/g. Fügen Sie doch ein Literal /muster/flags ein, entfernen Einfügen oder Fokusverlust die Begrenzer und mischen die Flags. Ein leeres Muster ist ein Fehler. Ein ungültiges Muster zeigt die JavaScript-Meldung.

2

Nur das Flag umschalten, das Sie prüfen wollen

g ist standardmäßig an. Schalten Sie es aus, um zu bestätigen, dass Sie wirklich nur einen Treffer wollten. Setzen Sie m, bevor Sie ^ auf einer zweiten Zeile vertrauen. Setzen Sie u vor \p{…} — ohne u matcht \p{L} die literalen Zeichen p{L}, keine Buchstaben. Lassen Sie y aus, außer Sie prüfen einen Treffer, der bei Index 0 beginnen muss.

3

Prüfen klicken und die Karte lesen, nicht nur die Hervorhebung

Die Hervorhebung zeigt, wo der Treffer sitzt. Die Karte zeigt den Index und jede Gruppe. Eine Karte anklicken hebt diesen Treffer hervor. Im Replace-Modus lesen Sie die ersetzte Zeichenkette unter den Karten, bevor Sie das Muster in den Code kopieren.

Beispiele, Tokens und eine lokale Datei

Die Kacheln sind Fixtures, keine Bibliothek von Produktionsvalidatoren.

Beispiele: Schlüssel=Wert, Ziffern, benanntes Datum, E-Mail (approx.), mehrzeilig ^, Gruppen ersetzen. Eine Wahl füllt die Felder und führt sofort aus
„Probe laden“ macht dasselbe mit der Paar-Fixture: (\w+)=(\d+) auf user=42 role=admin env=prod
Der Spickzettel setzt \d, \w, \s, ., [], ^, $, \b, +, *, ? und () an der Einfügemarke ein. Klammern setzen die Einfügemarke nach innen
Der Upload liest eine .txt-, .md- oder .log-Datei bis 32 MiB in die Testzeichenfolge, im Browser. Nehmen Sie einen kurzen Ausschnitt, wenn das Muster nicht offensichtlich linear ist
Löschen setzt Muster, Text, Ersetzung und Modus zurück und die Flags auf g

Dieselbe Engine in Node

Treffer so sammeln wie der Tester

Nodes RegExp ist dieselbe Sprache. matchAll verlangt das Flag g. Ohne g rufen Sie exec einmal auf.

Einfaches Beispiel

const subject = 'user=42 role=admin env=prod' const re = /(\w+)=(\d+)/g const matches = [...subject.matchAll(re)] // Länge 1 — role=admin sind keine Ziffern // matches[0][0] === 'user=42' // matches[0][1] === 'user' // matches[0][2] === '42'
Eine Ersetzung ansehen, bevor sie eine Datei ändert

Die Ersetzungsmuster sind dieselben, die das Replace-Feld akzeptiert. Das ist die eingebaute Kachel, keine eigene Template-Sprache.

Einfaches Beispiel

const out = 'a=1 b=2'.replace(/(\w+)=(\d+)/g, '[$1=$2]') // [a=1] [b=2] const wrapped = 'x=10'.replace(/(\d+)/g, '[$1]') // x=[10]
FastMinify regex-tester

Keine Installation, nichts wird hochgeladen, Flags und Gruppen sichtbar, Replace-Vorschau inklusive. Gegenseite: kein Dialekt-Schalter, Sticky nur bei Index 0, höchstens 500 zurückgegebene Treffer, und ein verschachtelter Quantor kann den Tab einfrieren, weil die Ausführung lokal ist. Behalten Sie die Seite für eine Fixture und ein Review. Committen Sie das Muster neben Tests, wenn es Produktionseingaben schützt. Stand der Ausdruck nur für einen Slug oder einen Schreibweisenwechsel, wechseln Sie zu Slugify oder zum Case-Converter, statt ihn zu pflegen.

Fazit

Testen Sie das Muster gegen eine Zeichenkette, die scheitern soll, in der Engine, die es ausführen wird. Für JavaScript ist das RegExp, und genau die nutzt der Regex-Tester — einschließlich eines JSON-Schema-pattern, das Sie danach mit Ajv im JSON-Schema-Validator kompilieren. Nehmen Sie die Kachel E-Mail (approx.) nicht als Validator, erwarten Sie nicht, dass Flag y mitten in der Zeichenkette weitermacht, und geben Sie einem verschachtelten Quantor kein 32-MiB-Log. Wenn die Aufgabe ein Slug oder ein Schreibweisenwechsel ist, lassen Sie den Ausdruck und nehmen Sie das passende Werkzeug im Hub der Entwickler-Utilities.

Nur JavaScript-RegExp — ein PCRE-Snippet, das der Tester ablehnt, scheitert auch in Node
Nach jeder Änderung auf Prüfen klicken; die Karten folgen nicht der Einfügemarke
Gieriges .+ zwischen Anführungszeichen ist ein Treffer; lazy ist jedes kürzeste Paar, kein Bedeutungsfilter
Benannte Gruppen erscheinen einmal. Mehr als 500 Treffer sind eine gekürzte Liste, kein vollständiger Scan
Flag y matcht in diesem Werkzeug nur am Anfang der Testzeichenfolge
Teilen Sie diesen Artikel
Teilen Sie diesen Artikel: