MiServe DevTools

Ihre Sticker

Heften Sie hier Tools an. Sie werden in diesem Browser gespeichert.

Regex-Tester für JavaScript und Go (RE2)

Testen Sie einen regulären Ausdruck mit der JavaScript-Engine oder der RE2-Engine von Go an Ihrem Text und sehen Sie jeden Treffer, jede Capture-Gruppe und jede Ersetzung.

Flags

Treffer im Text

Syntax-Spickzettel für beide Engines
TokenBedeutungJavaScriptGo (RE2)
. Ein beliebiges Zeichen außer einem Zeilenumbruch. Mit dem Flag s auch Zeilenumbrüche. Ja Ja
\d \w \s Eine Ziffer, ein Wortzeichen, ein Leerraumzeichen. Die Großbuchstaben \D, \W und \S treffen jeweils das Gegenteil. Ja Ja
[abc] [^abc] [a-z] Ein Zeichen aus einer Menge, ein Zeichen, das nicht in der Menge ist, ein Zeichen aus einem Bereich. Ja Ja
^ $ Anfang und Ende des Textes. Mit dem Flag m Anfang und Ende jeder Zeile. Ja Ja
\b \B Eine Wortgrenze und eine Position, die keine Wortgrenze ist. Ja Ja
* + ? {2,5} Null- oder mehrmals, ein- oder mehrmals, null- oder einmal, 2- bis 5-mal. Jeder Quantor nimmt so viel wie möglich. Ja Ja
*? +? ?? {2,5}? Dieselben Quantoren, die so wenig wie möglich nehmen. Ja Ja
(…) (?:…) Eine Capture-Gruppe und eine Gruppe, die nur gruppiert. Ja Ja
(?<name>…) Eine benannte Capture-Gruppe. Go akzeptiert diese Form seit Version 1.22 und (?P<name>…) in jeder Version. Ja Ja
a|b Entweder a oder b. Ja Ja
\p{L} \p{Lu} Eine Unicode-Eigenschaft: ein beliebiger Buchstabe, ein beliebiger Großbuchstabe. JavaScript braucht dafür das Flag u. Ja Ja
(?i) (?s) (?m) Flags innerhalb des Musters. In JavaScript werden Flags außerhalb gesetzt. Nein Ja
\A \z Anfang und Ende des gesamten Textes, unabhängig vom Flag m. Nein Ja
[[:alpha:]] Eine POSIX-Zeichenklasse innerhalb einer Menge. Nein Ja
(?=…) (?!…) Lookahead: Was folgt, muss passen oder darf nicht passen, ohne verbraucht zu werden. Ja Nein
(?<=…) (?<!…) Lookbehind: Was davor steht, muss passen oder darf nicht passen. Ja Nein
\1 \k<name> Rückverweis: derselbe Text, den eine frühere Gruppe erfasst hat. Ja Nein

Läuft mit WebAssembly in Ihrem Browser. Nichts, was Sie einfügen, wird hochgeladen.

Über dieses Tool

Zwei Engines aus zwei Familien

Regex-Engines gibt es in zwei Familien. Backtracking-Engines wie PCRE und die Standard-Engines von JavaScript, Python, Java und .NET probieren einen Weg durch das Muster und gehen zurück, wenn er scheitert. Erst diese Bauweise macht Lookahead, Lookbehind und Rückverweise möglich. Automatenbasierte Engines wie RE2 und das Go-Paket regexp verfolgen alle möglichen Wege gleichzeitig, sodass ihre Laufzeit linear mit der Länge des Textes wächst. Der Preis dafür: Lookaround und Rückverweise gibt es nicht.

Die JavaScript-Engine ist hier das RegExp Ihres Browsers. Die Go-Engine ist das Standardpaket regexp von Go, nach WebAssembly kompiliert. Ihr Muster wird hier also von demselben Code ausgeführt wie in einem Go-Programm. Go akzeptiert die Syntax von RE2.

So lesen Sie die Ergebnisse

Jeder Treffer wird im Text umrandet und hervorgehoben, in zwei abwechselnden Farben, damit sich direkt aneinandergrenzende Treffer unterscheiden lassen. Ein leerer Treffer, etwa der, den x* zwischen zwei Buchstaben findet, erscheint als schmaler Strich. Die Tabelle listet Anfang und Ende jedes Treffers und den Text jeder Capture-Gruppe. Eine Gruppe, die an einem Treffer nicht beteiligt war, wird als „nicht erfasst“ markiert; das ist etwas anderes als eine Gruppe, die einen leeren String erfasst hat.

Positionen zählen UTF-16-Codeeinheiten ab null, und das Ende ist exklusiv: Es sind die Zahlen, die Sie in JavaScript an String.prototype.slice übergeben. Go selbst meldet Byte-Offsets im UTF-8-Text; das Tool rechnet sie um, sodass beide Engines dieselben Zahlen zeigen.

In JavaScript findet ein Muster ohne das Flag g nur den ersten Treffer und ersetzt auch nur diesen. Die Go-Engine meldet immer alle Treffer, so wie FindAllStringSubmatchIndex und ReplaceAllString.

Katastrophales Backtracking

Eine Backtracking-Engine kann exponentielle Zeit brauchen, wenn Quantoren verschachtelt sind oder sich überlappen. Das klassische Beispiel ist (a+)+$, getestet an einer langen Folge von a, auf die ein anderes Zeichen folgt: Die Engine probiert jede Möglichkeit aus, die Folge zwischen innerem und äußerem Quantor aufzuteilen, bevor sie aufgibt. Auf einem Server ist das ein Denial-of-Service-Risiko, bekannt als ReDoS.

Dieses Tool führt JavaScript-Muster in einem Hintergrund-Worker aus und stoppt den Worker nach 1,5 Sekunden, sodass die Seite reaktionsfähig bleibt und Ihnen sagt, was passiert ist. Wenn Sie dasselbe Muster mit der Go-Engine testen, sehen Sie schnell, ob die Langsamkeit vom Backtracking kommt, denn Go garantiert eine Laufzeit, die linear zur Länge des Textes ist.

Fragen

Warum funktioniert mein Muster in JavaScript, aber nicht in Go?

Häufig liegt es an Lookahead, Lookbehind oder einem Rückverweis, die RE2 weglässt, um lineare Laufzeit garantieren zu können. Eine weitere häufige Ursache sind Flags: Go kennt keine Flags außerhalb des Musters, deshalb schreibt man die Suche ohne Beachtung der Groß-/Kleinschreibung als (?i) an seinen Anfang.

Wie unterscheiden sich Ersetzungsstrings in JavaScript und Go?

Beide verwenden $1 für die erste Gruppe. Eine benannte Gruppe ist in JavaScript $<name> und in Go ${name}. In Go bedeutet $1x eine Gruppe namens 1x, schreiben Sie also ${1}x, wenn auf den Verweis ein Buchstabe, eine Ziffer oder ein Unterstrich folgt.

Kann ich hier PCRE-, Python- oder Java-Muster testen?

Auf dieser Seite laufen nur die JavaScript- und die Go-Engine. Die alltägliche Syntax ist in allen Varianten gleich, daher ist die JavaScript-Engine für einfache Muster eine gute Näherung. Funktionen wie possessive Quantoren, atomare Gruppen und Rekursion bietet hier aber keine der beiden Engines.

Wird der Text, den ich teste, an einen Server gesendet?

Nein. Beide Engines laufen in Ihrem Browser: JavaScript in einem Hintergrund-Worker, Go als WebAssembly-Modul. Das Tool stellt mit Ihrem Muster und Ihrem Text keine Netzwerkanfrage, und die Sicherheitsrichtlinie der Website blockiert Anfragen an alle anderen Hosts.

Weitere Tools in Text