Testen Sie JavaScript-Reguläre Ausdrücke gegen Ihren eigenen Text. Schalten Sie die Flags g, i, m, s und u um, prüfen Sie jeden Treffer mit Index und Capture-Gruppen und sehen Sie das Ersetzungsergebnis live in der Vorschau.
Sehen Sie jeden Treffer, jede Gruppe und jeden Index beim Tippen. Geben Sie ein Muster und etwas Text zum Abgleichen ein. Jedes Ergebnis wird mit seiner Position und seinen Capture-Gruppen aufgelistet, ungültige Muster melden die eigene Fehlermeldung der Engine, und das Ersetzungsfeld zeigt genau, was ein Replace-Aufruf erzeugen würde.
//g
Treffer–
Einen regulären Ausdruck so lesen wie die Engine
Flags ändern die Bedeutung, nicht nur die Suche
Die fünf Flags sind keine Präferenzen, sie definieren das Muster neu. Ohne g gibt eine Suche den ersten Treffer zurück und stoppt; mit ihm hält die Engine einen lastIndex-Cursor fest und geht den ganzen String entlang, was auch der Grund ist, warum ein globaler Regex, der über Aufrufe hinweg wiederverwendet wird, Treffer zu überspringen scheint. Das i-Flag faltet die Groß-/Kleinschreibung mit Unicode-Casemapping statt eines einfachen ASCII-Shifts.
Die beiden am meisten missverstandenen sind m und s. m ändert nur, was ^ und $ bedeuten, indem es sie an Zeilengrenzen statt an den ganzen String verankert; es macht nichts mit .. Umgekehrt ändert s nur ., sodass es einen Zeilenumbruch matchen kann. Der Name "dotall" ist der hilfreiche, den man sich merken sollte. Das u-Flag lässt das Muster auf Codepunkten statt auf UTF-16-Einheiten arbeiten, sodass . ein Emoji als eine Einheit matcht und \u{1F600}-Escapes legal werden. Es macht zuvor tolerierte Escapes auch zu Fehlern, weshalb ein bestehendes Muster genau in dem Moment kaputtgehen kann, in dem Sie es hinzufügen.
Gruppen, Indizes und Ersetzung
Jeder eingeklammerte Abschnitt captured standardmäßig, nummeriert nach der Reihenfolge seiner öffnenden Klammer, und diese Nummern sind es, auf die sich $1 und $2 in einer Ersetzung beziehen. Verschachtelung folgt derselben Regel, sodass in ((a)b) Gruppe eins ab und Gruppe zwei a ist. Wenn Sie Gruppierung nur für Alternation oder Wiederholung benötigen, vermeidet (?:...) die Zuweisung eines Captures und hält die Nummerierung lesbar.
Der für jeden Treffer gemeldete Index ist der Offset des ersten gematchten Zeichens, was wichtiger ist, als es klingt. Er lässt Sie zwei identische Treffer an verschiedenen Positionen unterscheiden, bestätigen, dass ein Anker das erwartete getan hat, und das klassische Null-Längen-Match diagnostizieren. Ein Muster wie \d* matcht den leeren String überall, sodass ein globaler Scan an jeder Position einen Treffer findet; die Engine rückt nur vor, weil Implementierungen den Cursor bei leerem Match manuell vorschieben.
Backtracking und das Match-Limit
Die meisten Engines, einschließlich der von JavaScript, verwenden Backtracking. Wenn ein Teil des Musters fehlschlägt, kehrt die Engine zum letzten Entscheidungspunkt zurück und versucht einen anderen Pfad. Meist ist das unsichtbar. Es wird katastrophal, wenn verschachtelte Quantoren die Zahl der Pfade exponentiell wachsen lassen, die klassische Form ist (a+)+b gegen eine lange Folge von a-Zeichen ohne b. Diese Eingabe kann einen Browser-Tab hängen lassen, und wenn das Muster von einer Benutzereingabe stammt, wird es zu einem Denial-of-Service-Vektor.
Zwei Gewohnheiten vermeiden fast all das: bevorzugen Sie spezifische Zeichenklassen statt .*, sodass Alternativen sich nicht überlappen können, und verankern Sie Muster, wo Sie können, da ein verankerter Fehlschlag sofort abgewiesen wird, statt an jeder Offset neu versucht zu werden. Dieses Werkzeug begrenzt Ergebnisse zudem auf 500 Treffer und sagt Ihnen, wenn es abgeschnitten hat, sodass ein ausuferndes Muster zu einem langsamen Ergebnis statt zu einer eingefrorenen Seite führt.
FAQ
Welchen Regex-Geschmack verwendet das?
JavaScript, also die im Browser eingebaute ECMAScript-Engine. Perl-, PCRE- und Python-Muster sind ähnlich, unterscheiden sich aber bei Lookbehind, benannten Gruppen und einigen Escapes.
Was ändert das g-Flag wirklich?
Ohne es erhalten Sie nur den ersten Treffer. Mit ihm scannt die Engine den ganzen String und gibt jeden Treffer zurück, was die Liste hier füllt.
Warum bekomme ich leere Treffer?
Ihr Muster kann null Zeichen matchen, wie `\d*` es tut. Ein globaler Scan meldet dann an jeder Position einen Treffer, und die Engine schreitet manuell voran, um eine Schleife zu vermeiden.
Wie verweise ich in der Ersetzung auf Capture-Gruppen?
Verwenden Sie $1 für die erste Gruppe, $2 für die zweite und $& für den ganzen Treffer. Schreiben Sie $$, wenn Sie ein literales Dollarzeichen benötigen.
Was bedeutet "zeige die ersten 500"?
Die Ergebnisliste ist auf 500 Treffer begrenzt, damit ein sehr breites Muster die Seite nicht einfrieren kann. Die Ersetzungsvorschau wird dennoch auf den gesamten Text angewendet.
Warum macht mein Muster die Seite langsam?
Verschachtelte Quantoren wie (a+)+ verursachen exponentielles Backtracking. Verwenden Sie spezifische Zeichenklassen statt .* und verankern Sie das Muster, um das Matchen linear zu halten.