Was bedeutet « einen regulären Ausdruck testen »?
Einen regulären Ausdruck testen (« regex test online », « tester regex javascript ») bedeutet, ein Muster gegen einen echten Text auszuführen und genau zu beobachten, was die Engine zurückgibt: die gefundenen Zeichenketten, ihre Position und den Wert der Capture-Gruppen. Ein Muster, das « richtig aussieht », sagt nichts, solange es nicht auf Ihren Daten gelaufen ist — der einzige Unterschied, der zwischen der Regex im Tutorial und der Regex im Produktivbetrieb zählt.
Die Prüfung beantwortet drei verschiedene Fragen. Ob es matcht : das Treffer-Tableau sagt es in der ersten Zeile. Wo und wie oft : Index und Länge zeigen, ob der Anker am richtigen Platz war. Was es erfasst : die nummerierten oder benannten Gruppen zeigen, ob der Teil, den Sie extrahieren wollten, tatsächlich der richtige ist.
Die Metazeichen, die den Unterschied machen
Der Punkt . ersetzt jedes Zeichen außer dem Zeilenumbruch — daher das Flag s wenn Ihr Text mehrzeilig ist. Die Quantifizierer *, + und ? sind greedy : sie stoppen bei der ersten Zahl an Wiederholungen, die ausreicht. Das Suffix ? (*?, +?, {2,5}?) kehrt dieses Verhalten um und erzeugt die Lazy-Variante, die man fast immer bevorzugen sollte, wenn ein .* das Zeilenende verschlingt.
Die eckigen Klammern definieren eine Klasse: [abc] akzeptiert ein Zeichen aus der Liste, [^abc] alles außer ihnen, [a-z0-9] einen Bereich. Vorsicht mit der Negation am Klassenanfang — [^...] nur für die erste Position, sonst ^ wieder wörtlich. Das Pipe | trennt Alternativen und verhält sich wie eine niedrige Priorität: ^cat|dog$ bedeutet « der gesamte Text ist cat » oder « der gesamte Text ist dog », nicht « cat oder dog am Anfang oder am Ende » — dann muss man gruppieren: ^(?:cat|dog)$.
Gruppen, Lookahead und Lookbehind
Klammern erfassen. Gruppe 1 ist zugänglich mit $1 auf der Ersetzungsseite und \1 auf der Musterseite, benannte Gruppen mit $<nom> und \k<nom> — ab drei Gruppen deutlich lesbarer. (?:...) gruppiert, ohne eine Nummer zu erzeugen — besser, sobald Sie nur wegen der Struktur erfassen.
Die Vorhersagen (lookaround) prüfen ohne zu verbrauchen: (?=...) verlangt, dass das Folgende passt, (?!...) verbietet das, (?<=...) und (?<!...) tun dasselbe für das Vorherige. So erzwingt man ein Sonderzeichen in einem Passwort, ohne es in der Erfassung mitzuführen: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: wenn die Regex zur Zeitbombe wird
Das ReDoS (Regular Expression Denial of Service) stammt vom Backtracking : bei fast passender Eingabe untersucht ein Muster wie (a+)+$ prüft alle Möglichkeiten, die « a » zu zerlegen, bevor es scheitert, und die Zahl der Explosionen wächst exponentiell. Zwei Faustregeln: das Muster mit einem realistischen Volumen testen — der Tab « Performance » macht das für Sie — und nie eine unauditierte Regex auf einer Eingabe von außen ohne Größenbegrenzung laufen lassen. Auf einem Server friert eine blockierte Regex einen ganzen Worker bis zum Ablauf des Timeouts ein.
JavaScript, PCRE, Python: gleiche Grundlagen, kleine Unterschiede
Der Tester verwendet die native Engine des Browsers, also ECMAScript. Die grundlegenden Syntaxregeln — Klassen, Quantifizierer, Gruppen, Lookahead, Flags g i m s u y — sind bei PCRE (PHP, Perl), bei Python mit re, bei Java und Go. Die Unterschiede betreffen vor allem das Lookbehind (in JavaScript lange nicht vorhanden, heute unterstützt), die Unicode-Eigenschaften und Flags im Muster wie (?i), die PCRE vorbehalten sind. Ein Muster von einer in die andere Sprache zu übertragen, bleibt also Detailarbeit — keine Neuerfindung.
Empfohlen für
Frontend- und Backend-Entwickler (Formularvalidierung, Log-Parsing, Datenmigration), Ops und DevOps (Konfigurationsfilter, WAF-Regeln), Tester und Analysten (Spaltenextraktion, Formatprüfung), Redakteure und Data Analysten (Bereinigung von Dateien), Studierende (Metazeichen verstehen) und alle, die einen regulären Ausdruck schnell, vollständig und vertraulich testen wollen — dazu kommen der JSON-Formatter, der URL-Encoder und -Decoder, der Base64-Encoder und -Decoder und der JWT-Encoder und -Decoder.