Entwickler

Regulären Ausdruck online testen (mit echten Mustern)

7 Min. Lesezeit

Ein regulärer Ausdruck wird getestet, indem man das Muster schreibt, die passenden Flags aktiviert und es gegen einen echten Testtext laufen lässt. Danach prüft man zwei Dinge, bevor der Regex in den Code wandert: die hervorgehobene Vorschau, die zeigt, welche Textstellen tatsächlich als Treffer zählen, und die erfassten Gruppen, die zeigen, welcher Teil eines Treffers sich später im Code weiterverarbeiten lässt. Wer diesen Schritt überspringt, findet den Fehler im Muster meist erst in Produktion, an einer Stelle, an der er am teuersten ist.

Muster, Flags und Gruppen

Ein Muster steht zwischen zwei Schrägstrichen, /muster/, eine Konvention, die aus Perl stammt und sich seither in praktisch jeder Sprache mit nativer Regex-Syntax hält. Die Schrägstriche selbst gehören nicht zum Muster, sie markieren nur Anfang und Ende.

Direkt danach folgen die Flags, einzelne Buchstaben, die das Verhalten des gesamten Musters verändern. Es gibt genau vier:

  • g (global): Findet jeden Treffer im Text, nicht nur den ersten. Ohne dieses Flag bricht die Suche nach dem ersten Match ab, selbst wenn der Text zehn weitere passende Stellen enthält.
  • i (case-insensitive): Ignoriert Groß- und Kleinschreibung. /hallo/i matcht Hallo, HALLO und hAlLo gleichermaßen.
  • m (multiline): Lässt ^ und $ nicht nur Anfang und Ende des gesamten Textes markieren, sondern Anfang und Ende jeder einzelnen Zeile. Bei mehrzeiligem Text ist das oft genau das, was man eigentlich will.
  • s (dotAll): Erweitert den Punkt . so, dass er auch einen Zeilenumbruch matcht. Ohne dieses Flag steht . für “jedes Zeichen außer einem Zeilenumbruch”.

Runde Klammern () innerhalb eines Musters erfassen einen Teil des Treffers als eigene Gruppe, zugreifbar über ihre Position: Gruppe 1 ist die erste öffnende Klammer von links, Gruppe 2 die zweite, und so weiter. Wer sich nicht auf die Reihenfolge verlassen will, vergibt einen Namen: (?<jahr>\d{4}) erfasst dieselbe Zahl, macht sie aber über den Schlüssel jahr statt über eine Positionsnummer zugänglich, was ein Muster mit mehreren Gruppen deutlich lesbarer macht.

Vier Muster, die in der Praxis vorkommen

Die folgende Tabelle zeigt vier Regex-Muster, wie sie in echtem Code auftauchen, jeweils mit Beispielen, die matchen, welche nicht matchen, und was die erfassten Gruppen liefern.

PatternFlagsMatchesDoesn’t matchCaptures
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$nonejane.doe@example.comjane@example (keine Top-Level-Domain)keine
#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})g#2F7BFF, #fff#12G456 (G ist kein Hex-Zeichen)Gruppe 1: 2F7BFF
\/(\w+)\/(\w[\w-]*)g/users/123, /products/abc-456/users (kein zweites Segment)Gruppe 1: Ressourcentyp, Gruppe 2: ID
^\d{4}-\d{2}-\d{2}$none2026-07-1107/11/2026 (falsches Format)keine

Zwei davon lohnen einen genaueren Blick, weil sie zeigen, wie die einzelnen Bausteine zusammenspielen.

Beim Pfad-Muster \/(\w+)\/(\w[\w-]*) mit dem g-Flag steht \/ für einen wörtlichen Schrägstrich (in JavaScript muss er innerhalb der Delimiter maskiert werden, sonst würde er das Muster vorzeitig beenden). Darauf folgt (\w+), eine Gruppe aus einem oder mehr Wortzeichen, gefolgt von einem weiteren \/ und (\w[\w-]*), einer zweiten Gruppe, die mit einem Wortzeichen beginnen muss, danach aber auch Bindestriche zulässt. Gegen /products/abc-456 gehalten, liefert Gruppe 1 products (der Ressourcentyp) und Gruppe 2 abc-456 (die ID mit Bindestrich, den \w allein nicht abdecken würde). Genau diese Zweiteilung ist der Grund, warum jemand ein solches Muster überhaupt schreibt: Ein Router kann Gruppe 1 gegen eine Liste bekannter Ressourcen prüfen und Gruppe 2 direkt als ID an eine Datenbankabfrage weiterreichen, ohne den Pfad manuell an Schrägstrichen zu splitten. Ohne das g-Flag würde bei /users/123/products/abc-456 nur der erste Treffer, /users/123, gefunden, der zweite Pfadausschnitt bliebe unentdeckt.

Beim Hex-Farb-Muster #([0-9a-fA-F]{6}|[0-9a-fA-F]{3}) macht das g-Flag den eigentlichen Unterschied aus. Das Muster selbst verlangt ein #, gefolgt von entweder genau sechs Hex-Ziffern oder genau drei (das | innerhalb der Klammer ist eine Oder-Verzweigung, die beide Schreibweisen abdeckt, #2F7BFF und die Kurzform #fff). Ohne g-Flag würde eine Suche in einer CSS-Datei mit fünfzehn Farbwerten nach dem ersten Treffer stoppen, egal wie viele weitere Hex-Codes danach folgen, weil eine Regex ohne g-Flag in JavaScript per Definition nur den ersten Match zurückgibt. Mit g-Flag liefert dieselbe Suche alle fünfzehn, jeden mit seiner eigenen Gruppe 1, dem reinen Hex-Wert ohne Raute. Genau dieses Verhalten braucht ein Skript, das aus einem Stylesheet automatisch eine Liste aller verwendeten Markenfarben extrahiert, etwa um sie gegen ein Design-System abzugleichen oder in eine Konfigurationsdatei zu exportieren.

Probier es selbst aus

Trag unten dein eigenes Muster und deinen eigenen Testtext ein, die Vorschau und die Gruppen aktualisieren sich sofort.

/ /
Regex-Tester
Kostenlos, ohne Anmeldung, auf jedem Gerät.
Vollständiges Tool öffnen

Häufige Fehler und Sonderfälle

Das g-Flag vergessen. Ohne es stoppt der Regex nach dem ersten Treffer, was still alles bricht, das alle Vorkommen erwartet, etwa ein “alles ersetzen” in einer String-Bearbeitung oder eine Extraktion, die jede Fundstelle in einem Dokument braucht. Der Code läuft ohne Fehlermeldung weiter, liefert aber nur einen Bruchteil der erwarteten Ergebnisse, was solche Bugs besonders unangenehm zu finden macht.

Der nicht maskierte Punkt. Ein nicht maskierter . entspricht jedem Zeichen, nicht einem wörtlichen Punkt. Ein Muster wie 192.168.1.1, das eine IP-Adresse abgleichen soll, passt dadurch versehentlich auch auf 192X168X1X1, weil jeder Punkt im Muster als Platzhalter gilt und nicht als literales Zeichen. Wer den Punkt tatsächlich meint, muss ihn maskieren: \. steht für einen wörtlichen Punkt und nichts anderes.

Gierige vs. faule Quantoren. .* nimmt standardmäßig so viel wie möglich (gierig) und kann damit weit über das eigentlich Gewünschte hinausgreifen, etwa wenn <.*> in einem ganzen HTML-Block angewendet vom ersten < bis zum letzten > reicht, statt bei einem einzelnen Tag zu stoppen. .*? (faul, das Fragezeichen macht den Quantor nicht gierig) nimmt stattdessen so wenig wie möglich und stoppt am frühestmöglichen Punkt, was bei verschachtelten oder wiederholten Strukturen fast immer das erwartete Ergebnis liefert.

Fehlende Anker. Ohne ^ und $ kann ein Muster als Teilstring überall im Text passen, sodass ein “Validierungs”-Muster ohne Anker eine Zeichenkette bestehen lässt, die nur einen gültigen Teil enthält, etwa eine E-Mail-Adresse mitten in einem längeren, eigentlich ungültigen String, wodurch fehlerhafte Eingaben unbemerkt durchrutschen. ^ und $ erzwingen, dass das Muster gegen die gesamte Zeichenkette matcht, nicht nur gegen einen Ausschnitt davon.

Häufig gestellte Fragen

Was ist der eigentliche Unterschied zwischen der Verwendung des g-Flags und dem Weglassen? Ohne g-Flag liefert eine Regex-Methode wie String.prototype.match() nur den ersten Treffer und stoppt dort. Mit g-Flag durchsucht dieselbe Methode den gesamten Text und liefert ein Array aller Treffer. Bei Aufgaben wie “alle Vorkommen ersetzen” oder “alle E-Mail-Adressen in einem Text finden” ist das g-Flag deshalb keine Option, sondern eine Voraussetzung.

Wie kann ich ein wörtliches Sonderzeichen wie einen Punkt, ein Dollarzeichen oder eine Klammer matchen? Mit einem Backslash davor. Zeichen wie . $ ^ { } ( ) | [ ] \ * + ? haben in einer Regex eine besondere Bedeutung und müssen maskiert werden, um wörtlich gemeint zu sein: \. für einen Punkt, \$ für ein Dollarzeichen, \( für eine öffnende Klammer. Der Backslash selbst wird ebenfalls maskiert, \\, wenn er im Text tatsächlich vorkommen soll.

Was ist eine nicht erfassende Gruppe, (?:...), und wann brauche ich sie statt einer normalen (...)-Gruppe? Eine nicht erfassende Gruppe gruppiert einen Teil des Musters, etwa um einen Quantor oder eine Oder-Verzweigung darauf anzuwenden, ohne dass dieser Teil als eigene nummerierte Gruppe im Ergebnis auftaucht. Das ist nützlich, sobald ein Muster mehrere echte Erfassungsgruppen enthält und man die Nummerierung nicht durch rein strukturelle Klammern verschieben will, etwa bei (?:https?|ftp):\/\/(\w+), wo nur die Domain als Gruppe 1 gebraucht wird und das Protokoll-Oder davor keine eigene Nummer verdient.

Sendet dieses Tool mein Muster oder meinen Testtext irgendwohin? Nein. Der Regex-Tester läuft vollständig im Browser über die native JavaScript-RegExp-Engine. Muster und Testtext werden zu keinem Zeitpunkt an einen Server geschickt, die gesamte Auswertung passiert lokal auf dem Gerät.

RegexValidierungEntwicklerReguläre Ausdrücke
Regex-Tester
Probieren Sie es jetzt selbst mit dem vollständigen Tool.
Jetzt ausprobieren