Ich habe den größten Teil eines Nachmittags einmal gegen einen einzigen gierigen Quantifizierer verloren. Ich schrieb eine Umleitungskarte für eine WordPress-Migration - ein paar hundert alte URLs, die neu geschrieben werden mussten, um neue Slugs zu schreiben -, und ich hatte einen Regex, der war vermeintlich um den nachlaufenden Slug von jedem Pfad zu erfassen. Es funktionierte mit den drei URLs, die ich in meinem Kopf getestet habe. Es funktionierte nicht am vierten, der zwei Wegsegmente hatte, weil .* Hatte den ersten Schrägstrich fröhlich geschluckt und alles danach. Die Regel leitete stillschweigend die Hälfte der Website an den falschen Ort, und ich fand es von einem Leser heraus, nicht von meinen Tests, weil mein "Testen" auf das Muster starrte und es vertraute.
Das ist das Kernproblem bei regulären Ausdrücken: Sie sind nur schreibgeschützt, bis Sie sie gegen etwas ausführen. Ein Muster wird bis zu dem Moment, in dem der reale Eingang als plausibles Element angezeigt wird, als plausible gelesen, und die Fehlermodi sind leise. Ein Regex, der nichts übereinstimmt, wirft keinen Fehler. Ein zu viel zu viel übereinstimmender Regex wirft keinen Fehler aus. Ein Regex mit einer subtil falschen Erfassungsgruppe gibt Ihnen die falsche Teilzeichenfolge und geht weiter. Die einzige Möglichkeit, ein Muster zu kennen, besteht darin, es mit dem unordentlichen, kantengeschützten Text zu füttern, den es tatsächlich sehen wird und suchen bei dem, was es packt.
ein Regex-Tester schließt diese Lücke. Sie fügen Ihr Muster in ein Feld ein, Ihren Beispieltext in einen anderen, und jedes Spiel leuchtet auf - mit den ausgebrochenen Erfassungsgruppen, damit Sie genau sehen können, welcher String der Schnur in Gruppe 1 gegenüber Gruppe 2 gelandet ist. Die, die ich für toolz.dev erstellt habe, läuft auf dem Browser RegExp Engine, die gleiche, die Ihr Javascript und TypeScript-Code verwendet, also sehen Sie im Tester, was Sie in der Produktion erhalten. Keine Näherung, kein "nah genug".
Dieser Leitfaden beschreibt, wie Sie mit dem Tester Muster schnell debuggen, was jede Flagge tatsächlich bewirkt, wie Gruppen und benannte Gruppen in der Ausgabe angezeigt werden, und die Javascript-spezifischen Probleme, die Personen aus Python oder PCRE auslösen.
tl; dr: Fügen Sie Ihr Muster in die toolz.dev Regex-Tester (keine Schrägstriche erforderlich), schalten Sie die G/I/M/S/U/Y-Flags um und legen Sie den Testtext unten ab. Matches markieren live mit abwechselnden Farben, jede nummerierte und benannte Erfassungsgruppe wird pro Übereinstimmung aufgelistet, und Syntaxfehler zeigen die genaue Nachricht der Engine. Es verwendet die echte JavaScript-Regexp-Engine, läuft 100% clientseitig, so dass sensible Protokolle niemals hochgeladen werden, und wird mit dem gekoppelt Regex-Builder Zum Zusammenbau von Mustern von Grund auf neu.
Wie testet man einen Regex, ohne sein gesamtes Programm auszuführen?
Der langsame Weg, um eine Regex zu debuggen, ist die Schleife, mit der die meisten von uns beginnen: Das Muster in Ihrem Code bearbeiten, das Programm ausführen, die Ausgabe lesen, raten, was schief gelaufen ist, wiederholen Sie. Jede Iteration kostet einen vollständigen Programmlauf, und das Feedback ist indirekt - Sie sehen die Konsequenz des Spiels, nicht das Match selbst.
Ein Tester klappt diese Schleife auf nichts. Sie fügen das Muster ein, fügen repräsentativen Text ein und sehen die Übereinstimmungen sofort. Wenn Sie ein Zeichen im Muster ändern, hebt das Update hervor. Dies verschärft das Feedback bis zu dem Punkt, an dem Sie können erforschen - versuche a + wo du eine hattest *, Fügen Sie eine Wortgrenze hinzu, lassen Sie eine Gruppe nicht erfassen - und beobachten Sie, wie der Effekt in Echtzeit landet, anstatt sich ihn vorzustellen.
Die Schlüsseldisziplin ist die Verwendung echt Testtext, nicht das saubere Beispiel in Ihrem Kopf. Die URL, die meine Weiterleitungskarte gebrochen hat, hatte zwei Pfadsegmente, mein mentaler Testfall hatte einen. Wenn ich die tatsächliche Liste der alten URLs in einen Tester eingefügt hätte, wäre das gierige Match in Zeile vier sichtbar falsch gewesen. Nehmen Sie die tatsächlichen Log-Zeilen, die tatsächlichen Benutzereingaben, die tatsächlichen Dateipfade - einschließlich der hässlichen - und lassen Sie sich vom Tester zeigen, wo das Muster vor den Benutzern auseinanderfällt.
Was ändern die Regex-Flags tatsächlich?
Flags ändern die Anwendung des gesamten Musters, und das Missverständnis steht hinter einem großen Anteil von "Warum nicht diese Arbeit" Momente. der Tester Stellt alle sechs JavaScript-Flags als Umschalttasten frei, sodass Sie eine umdrehen und die Ergebnisverschiebung beobachten können.
G - Global. Ohne sie, Matching Stopps beim ersten Treffer. Damit findet der Motor jede Übereinstimmung im Text. Im Tester ist Global standardmäßig aktiviert, da Sie fast immer alle Übereinstimmungen sehen möchten. Schalten Sie es aus, um zu bestätigen, wie ein Anruf mit einem einzigen Match wie String.match ohne g würde zurückkehren.
Ich - Fall ignorieren. macht das gesamte Muster CASE-unempfindlich, so error Streichhöl Error und ERRORdrohen unkompliziert und die am häufigsten verwendete Flagge nach g.
M - Mehrzeilig. Dieser wird weithin missverstanden. es tut nicht fällen . Kreuzlinienbrüche. es ändert was ^ und $ Anker zu: mit m, sie stimmen am Anfang und Ende von jedem überein säumen, nicht nur Anfang und Ende der ganzen Zeichenfolge. Wenn Sie Zeile für Zeile in einem Log übereinstimmen, möchten Sie dies.
S - Dotall. Dies ist die Flagge, die macht . stimmen Newline-Zeichen überein Ohne es, . Passt zu jedem Charakter ausgenommen Ein Zeilenumbruch, weshalb ein Muster, das mehrere Linien überspannen soll, stoppt oft leise beim ersten. Wenn Ihr Match die Grenzen überschreitet, s ist was du brauchst - nicht mdrohen
U - Unicode. Aktiviert den vollständigen Unicode-Modus, der macht \u{...} Entkommt Arbeit, behandelt Paare als einzelne Codepunkte und macht Zeichenklassen wie \p{Letter} vorhanden Wichtig, wenn Ihr Text Emoji oder nicht-lateinische Skripte enthält.
Y - klebrig. Verankert jeden Spielversuch an die genaue Position von lastIndex, so gelingt das Matching nur, wenn es genau dort beginnt. Es ist eine Nischenflagge, die in Tokenizern und Parsern verwendet wird, die meisten Alltagsarbeit berührt sie nie.
Die am meisten Zeit kosten m gegen sdrohen Die Leute greifen nach Multiline, wenn sie Dotall meinen. Wenn Ihr Punkt keine Linien überschreitet, benötigen Sie sdrohen Wenn Ihre Anker nicht an den Grenzen der Linien stoßen, benötigen Sie mdrohen Sie lösen unterschiedliche Probleme und werden oft zusammen verwendet.
Wie werden Aufnahmegruppen in der Ausgabe angezeigt?
Klammern in einem Muster erledigen zwei Aufgaben: Sie gruppieren Untermuster für Quantifizierer oder Wechsel erobern Das passende Stück für die Extraktion. Wenn Sie einen Regex verwenden, um Daten aus dem Text zu ziehen - ein Datum für Jahr und Monat, eine Protokollzeile und ein Level - die Erfassungsgruppen sind der gesamte Punkt, und das falsche Verstehen ist die häufigste Quelle für "das Muster übereinstimmt, aber ich habe die falsche Zeichenfolge bekommen."
der Tester Listet jedes Spiel mit seinen darunter aufgeschlüsselten Aufnahmegruppen auf. Gruppe 1 ist das erste parenthesized-Untermuster, die Gruppe 2 das zweite usw., das jeweils mit dem genauen Text angezeigt wird, den es für dieses Spiel erfasst hat. Dies macht die Gruppengrenze offensichtlich: Wenn Gruppe 1 mehr als erwartet erwischt hat, können Sie es sehen und die Klammer einziehen.
Benannte Gruppen erhalten die gleiche Behandlung. Wenn du schreibst (?<year>\d{4})-(?<month>\d{2}), zeigt der Tester die Aufnahmen nach Namen — <year> und <month> — Neben den nummerierten Äquivalenten können Sie die Namenskarte zu den von Ihnen beabsichtigten Slices bestätigen, bevor Sie sich darauf verlassen match.groups.year Im Code. Benannte Gruppen machen Muster selbstdokumentieren und lesbarer, und sie können sich im Tester richtig auflösen, ist der schnellste Weg, ihnen zu vertrauen.
Eine verwandte Falle taucht auf: Eine Gruppe, die am Muster teilnimmt, aber bei einem bestimmten Versuch nicht übereinstimmt, zeigt nicht eine leere Zeichenfolge. Diese Unterscheidung ist wichtig, denn in Javascript ist eine solche Gruppe undefined, und Code, der annimmt, dass es immer eine Zeichenfolge ist, die geworfen wird. Wenn Sie es im Tester sehen, werden Sie aufgefordert, diesen Zugriff zu schützen.
Welcher Regex-Geschmack ist das und warum ist es wichtig?
Reguläre Ausdrücke sind keine Sprache. Das Muster, das in Python funktioniert re Modul kann sich in Javascript anders verhalten - oder werfen und umgekehrt. dieses Tester Verwendet die in Ihrem Browser integrierte JavaScript-Engine (ECMAScript), die für Byte-für-Byte die gleiche Engine node.js ausführt. Wenn Sie also Javascript, TypeScript oder Knotencode schreiben, sind die Ergebnisse hier genau das, was Ihr Code bewirkt.
Diese Präzision schneidet in beide Richtungen. Wenn Sie ein Muster aus einer für PCRE geschriebenen Antwort kopieren (PHP und die preg_ Funktionen, die ich ständig in WordPress-Arbeit verwende) oder für Python, werden einige Funktionen nicht übersetzen. Javascript fehlte historisch gesehen Lookbehind-Behauptungen, gewann sie relativ kürzlich und verarbeitet immer noch einige Unicode-Eigenschaft Escapes anders. Possessive Quantifizierer und Atomgruppen aus PCRE existieren überhaupt nicht in JavaScript. Rekursion - ein PCRE-Feature zum Abgleichen geschachtelter Strukturen - hat kein JavaScript-Äquivalent.
Das praktische Ergebnis: Testen Sie den Geschmack, in dem Sie sich einsetzen. Ein Tester, der eine Engine implementiert, ist nützlicher als einer, der einen Fuzzy-Durchschnitt von allen implementiert, denn "er hat im Tester funktioniert" bedeutet "Es wird in meinem Code funktionieren." Für PHP- und WordPress-Arbeit behalte ich die Unterschiede im Auge und verifiziere die Serverseite separat; für alles JavaScript, dieser Tester ist die Quelle der Wahrheit. Das breitere Toolkit für diese Art der sprachbewussten Verifizierung wird in der Anleitung für die Coding-Toolsdrohen
Was sind die alltäglichen Verwendungen für einen Regex-Tester?
Erstellen und Debuggen von Validierungsmustern
E-Mail-Felder, Telefonnummern, Postleitzahlen, Slugs, semantische Versionszeichenfolgen - Jedes Formular validiert etwas, und die Validierung ist normalerweise ein Regex. Mit dem Tester können Sie die umständlichen Fälle vor dem Versand auf Ihr Muster werfen: die E-Mail mit einem Plus-Adressierungs-Tag, die Telefonnummer mit einer Nebenstelle, die Versionszeichenfolge wie 1.10.0 dass ein naives Muster abgeschnitten wird. Fügen Sie eine Spalte mit realen Werten ein und beobachten Sie, welche nicht übereinstimmen.
Daten aus Protokollen extrahieren
Serverprotokolle, Anwendungsprotokolle und CSV-Exporte sind semistrukturierter Text, und Regex zieht Felder aus ihnen heraus. Erfassen Gruppen Erfassen Sie den Zeitstempel, das Level, die Anfrage-ID. Die Aufschlüsselung der Tester pro Match ist genau die Ansicht, die Sie hier benötigen. Fügen Sie ein Dutzend echte Protokollzeilen ein und bestätigen Sie, dass jedes Feld in der richtigen Gruppe über alle hinweg und nicht nur in der ordentlichen ersten Zeile landet. Dies passt zu den API-Debug-Workflow Wo Antwortkörper und Header nach bestimmten Werten abgekratzt werden.
Suchen und Ersetzen über eine Codebasis
Editoren und IDES unterstützen Regex beim Finden und Ersetzen, und ein schlechtes Muster kann weit mehr als beabsichtigt umschreiben. Testen der harmonieren Seite in einem dedizierten Tester vor dem Ausführen ist eine billige Versicherung - sehen Sie genau, was das Muster für eine repräsentative Probe ausgewählt wird, und führen Sie dann die Ersetzen mit Vertrauen aus. Meine Weiterleitungs-Karten-Katastrophe war im Grunde ein Fund- und Ersatz, den ich nie zuerst gegen echten Input getestet habe.
Lernen und Lehren Regex
Die Live-Highlighting macht den Tester zu einem echten Lernwerkzeug. Erstellen Sie ein Muster nacheinander und beobachten Sie, wie das Match-Set schrumpft und wächst, während Sie Anker, Quantifizierer und Klassen hinzufügen. Sehen \d+ Schnapp dir eine ganze Zahl und dann \d Das Ergreifen einer einzelnen Ziffer bedeutet mehr für das Verständnis als jede Prosaerklärung. Wenn Sie bereit sind, ein Muster aus Komponenten zusammenzustellen, anstatt ein vorhandenes zu debuggen, Regex-Builder ist das Begleitwerkzeug.
Wie vermeidest du die Match-Falle mit Nulllänge?
Ein Muster, das einer leeren Zeichenfolge entsprechen kann - a*, \d*, (foo)? - Kann an jeder Position zwischen den Zeichen "übereinstimmen" und erzeugt eine Flut leerer Übereinstimmungen. Naiver Matching-Code, der nicht für immer über Match-Loops nach Null hinausgeht. der Tester Schutz vor diesem intern, indem es immer vorrückt, damit es nie hängt, aber es wird zeugen von Sie die leeren Übereinstimmungen.
Diese Anzeige ist eine Funktion, kein Rauschen. Ein Stapel leerer Übereinstimmungen ist der Tester, der Ihnen sagt, dass Ihr Quantifizierer zu freizügig ist. Wenn Sie "eine oder mehrere Ziffern" gemeint haben, haben Sie geschrieben \d* Wenn du wolltest \d+drohen Wenn eine Gruppe benötigt wird, haben Sie diese optional mit markiert ?drohen Die leeren Übereinstimmungen zu sehen ist die Diagnose, die Sie auf den Fix zeigt. Wenn Ihr Muster stimmt, sind die Streichhölzer die Teilzeichenfolgen, die Ihnen wichtig sind, und nichts anderes.
Javascript Regex vs. Andere Geschmacksrichtungen: Ein schneller Vergleich
| Feature | Javascript (dieser Tester) | PCRE (PHP) | Python re |
|---|---|---|---|
| Benannte Gruppen | (?<name>...) |
(?<name>...) oder (?P<name>...) |
(?P<name>...) |
| Rückblick | Unterstützt (moderne Motoren) | unterstützt | unterstützt |
| Atomgruppen / Possessiv | Nicht unterstützt | unterstützt | begrenzt |
| Rekursion | Nicht unterstützt | unterstützt | Nicht unterstützt |
| Punkt stimmt mit der Newline-Flagge überein | s (dotall) |
s (dotall) |
re.DOTALL |
Unicode-Eigenschaft \p{...} |
bedarf u Fahne |
bedarf u Modifikator |
regex Nur Modul |
| Sticky Matching | y Fahne |
\G Anker |
\G-wie via match Position |
Die Tabellenstunde lautet: "Regex" ist eine Familie, kein Standard. Die Syntax überlappt sich genug, um Sie in das Kopieren von Mustern über Sprachen hinweg zu säumen, und die Unterschiede sind genau die erweiterten Funktionen, nach denen Sie bei harten Problemen greifen. Testen Sie Ihren Zielgeschmack. Für JavaScript und Knoten ist das dieser Tester; Webentwickler-Toolkit Deckt ab, wo die anderen sprachspezifischen Werkzeuge passen.
Ist es sicher, Regex gegen sensiblen Text zu testen?
Der Text, gegen den Sie Regex testen, ist häufig die sensible Art: Produktionslogzeilen mit IP-Adressen und Benutzer-IDs, Exporte mit E-Mail-Adressen, Konfigurationsdateien mit internen Hostnamen. Das sind genau die Daten, die Sie sollte nicht Fügen Sie in ein Tool ein, das es an einen Server verschickt.
der toolz.dev Regex-Tester Läuft komplett in Ihrem Browser. Die Musterkompilierung, das Abgleichen, die Gruppenextraktion - alles ist clientseitiges Javascript, ohne dass ein Netzwerkantrag Ihr Muster oder Ihren Text überall enthält. Schneiden Sie Ihre Verbindung nach dem Laden der Seite ab und es funktioniert weiter. Das ist eine Architekturgarantie, kein Satz der Datenschutzrichtlinie, und es ist das gleiche Browser-First-Prinzip hinter jedem Werkzeug im Set, das in der Datenschutz-Leitfadendrohen
Das bedeutet, dass Sie die realen Log-Linien - die mit den tatsächlichen PII-PII-Fällen einfügen können, die die Kantenfälle des Musters anzeigen - und sicher gegen sie debuggen. Das ist der springende Punkt: Der Tester ist nur dann nützlich, wenn Sie ihm echte Eingaben geben, und echte Eingaben sind oft genau das, was Sie nicht an den Server eines anderen senden können.
FAQ
Wie teste ich einen regulären Ausdruck online?
Geben Sie Ihr Muster in das Feld Pattern ohne die umgebenden Schrägstriche ein, wählen Sie Ihre Flags aus und fügen Sie den Beispieltext in den Testbereich ein. Die Übereinstimmungen werden sofort hervorgehoben und die Gruppen für jedes Spiel werden aufgelistet. Alles läuft in Ihrem Browser – nichts wird hochgeladen.
Welchen Regex-Geschmack verwendet dieser Tester?
Es verwendet die in Ihrem Browser integrierte JavaScript (ECMAScript) -Regexp-Engine, die mit der in Node.js identisch ist. Die Ergebnisse stimmen überein, wie sich das gleiche Muster in Javascript und TypeScript verhält. JavaScript Regex unterscheidet sich von PCRE, Python's Re-Modul und Java-Mustern in einigen erweiterten Funktionen wie Atomgruppen und Rekursion. Testen Sie also den Geschmack, in dem Sie bereitstellen.
Was bedeuten die Regex-Flags g, i, m und s?
Das G (globale) Flag findet alle Übereinstimmungen statt, anstatt beim ersten Anhalten zu stoppen. Das i-Flag macht übereinstimmende Groß- und Kleinschreibung. Das M (Multiline) Flag lässt die ^ und $ Anker bei Zeilenumbrüchen übereinstimmen und nicht nur der Zeichenfolge Start und Ende. Mit dem Flag s (dotall) kann der Punkt auch den Newline-Zeichen entsprechen. Die M- und S-Flags sind oft verwechselt - M ändert die Anker, s ändert den Punkt.
Wie funktionieren Capture-Gruppen im Tester?
Klammern in Ihrem Muster erstellen Capture-Gruppen. Der Tester listet jede nummerierte Gruppe mit dem Text auf, den er für jede Übereinstimmung erfasst hat, sodass Sie überprüfen können, welches Stück der Zeichenfolge jedes Teil des gegriffenen Musters erfasst wird. Benannte Gruppen geschrieben als (?...) werden neben den nummerierten Gruppen namentlich angezeigt.
Warum stimmt meine Regex nichts überein oder wirft einen Fehler aus?
Ein Muster, das nichts übereinstimmt, hat normalerweise ein überspezifisches Zeichen oder ein nicht entwichenes Sonderzeichen wie ein literaler Punkt oder ein Pluszeichen. Ein Muster, das einen Fehler auslöst, hat ein Syntaxproblem, wie z. B. eine unausgeglichene Klammer oder Klammern. Der Tester zeigt die genaue Fehlermeldung der Engine an, damit Sie das Problem schnell finden können.
Wie stimme ich über mehrere Zeilen überein?
Aktivieren Sie das S (dotall)-Flag, wenn der Punkt die Zeilenumbrüche überspannt, und aktivieren Sie das M-Flag (Multiline), wenn die Anker ^ und $ am Anfang und Ende jeder Zeile übereinstimmen sollen. Durch die Kombination beider funktioniert ein einzelnes Muster auf natürliche Weise gegen mehrzeilige Eingaben wie Protokolle oder CSV-Zeilen.
Ist es sicher, Regex gegen sensible Daten zu testen?
Ja. Alle Übereinstimmungen erfolgen in Javascript in Ihrem Browser - es wird kein Muster oder Testtext an einen Server gesendet, nichts wird protokolliert und das Tool funktioniert mit deaktivierter Verbindung. Sie können sicher anhand von Logfiles, persönlichen Daten oder proprietären Formaten testen.
Was ist der Unterschied zwischen einem Regex-Tester und einem Regex-Builder?
Ein Regex-Tester führt ein vorhandenes Muster für Text aus, sodass Sie es überprüfen und debuggen können, während ein Regex-Builder Ihnen beim Erstellen eines Musters aus Komponenten oder allgemeinen Vorlagen hilft. Verwenden Sie den Regex Builder auf dieser Website, um ein Muster zusammenzustellen, und bringen Sie es dann zum Tester, um es anhand realer Beispieldaten zu überprüfen.
Reguläre Ausdrücke bleiben nur schreibgeschützt, bis Sie sie gegen echte Eingaben ausführen, und die Fehler sind leise - nichts stimmt überein, zu viel Übereinstimmungen, die falsche Gruppe erfasst und kein Fehler sagt Ihnen. Ein Tester macht das Muster sichtbar: Füge deinen Regex ein, Füttere es mit dem hässlichen echten Text und schaue genau, was er packt, bevor er das Falsche in der Produktion ergreift.

