Regex: Weniger gruselig als es aussieht
Reguläre Ausdrücke haben den Ruf, unleserlich zu sein. Das müssen sie nicht sein.
Du musst alle E-Mail-Adressen in einem Dokument finden. Oder Telefonnummern validieren. Oder Daten aus unordentlichem Text extrahieren.
Jemand sagt „verwende Regex". Du googlest die Syntax, findest so etwas wie ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$ und schließt sofort den Tab.
Reguläre Ausdrücke sehen einschüchternd aus, weil Leute sie clever statt klar schreiben. Lass uns das beheben.
Beginne mit wörtlichem Matching
Regex findet Muster. Das einfachste Muster ist wörtlicher Text.
cat matcht „cat" in „The cat sat." Nichts Ausgefallenes.
http matcht „http" in jeder URL. Immer noch unkompliziert.
Füge Wildcards schrittweise hinzu
. matcht ein einzelnes Zeichen. c.t matcht „cat", „cot", „cut".
* bedeutet „null oder mehr vom vorherigen". ca*t matcht „ct", „cat", „caat", „caaaaaat".
+ bedeutet „eins oder mehr". ca+t matcht „cat" und „caat", aber nicht „ct".
? bedeutet „null oder eins". colou?r matcht sowohl „color" als auch „colour".
Zeichenklassen sind dein Freund
[aeiou] matcht jeden Vokal. [0-9] matcht jede Ziffer. [A-Za-z] matcht jeden Buchstaben.
\d ist Kurzform für [0-9]. \w matcht Wortzeichen (Buchstaben, Ziffern, Unterstrich). \s matcht Leerraum.
Diese Bausteine handhaben die meisten realen Muster.
Anker kontrollieren Position
^ bedeutet „Zeilenanfang". $ bedeutet „Zeilenende".
^Hello matcht „Hello world", aber nicht „Say Hello".
world$ matcht „Hello world", aber nicht „world peace".
Gruppen erfassen Teile
Klammern gruppieren Dinge. Sie erfassen auch zur späteren Verwendung.
(\d{3})-(\d{4}) matcht „555-1234" und erfasst „555" und „1234" separat.
So extrahierst du spezifische Daten aus einem Muster-Match.
Echte Beispiele, erklärt
E-Mail (vereinfacht):
[\w.-]+@[\w.-]+\.\w+
Übersetzung: Wortzeichen/Punkte/Bindestriche, dann @, dann mehr davon, dann ein Punkt, dann Wortzeichen.
Telefonnummer:
\d{3}[-.\s]?\d{3}[-.\s]?\d{4}
Übersetzung: 3 Ziffern, optionaler Trenner, 3 Ziffern, optionaler Trenner, 4 Ziffern. Matcht „555-123-4567", „555.123.4567", „5551234567".
Datum (MM/DD/YYYY):
\d{2}/\d{2}/\d{4}
Übersetzung: 2 Ziffern, Schrägstrich, 2 Ziffern, Schrägstrich, 4 Ziffern.
Häufige Fehler
Sonderzeichen nicht maskieren. . bedeutet „jedes Zeichen" in Regex. Um einen wörtlichen Punkt zu matchen, verwende \..
Zu gierig sein. .* matcht so viel wie möglich. Für HTML-Tags matcht <.*> bei <b>bold</b> das Ganze, nicht nur <b>. Verwende <.*?> für nicht-gieriges Matching.
Überkomplizieren. Wenn du E-Mails wirklich validieren musst, verwende eine Bibliothek. Die „korrekte" E-Mail-Regex hat hunderte Zeichen.
Wann Regex nicht verwenden
HTML oder JSON parsen. Verwende einen richtigen Parser.
Komplexe Validierungslogik. Code ist oft klarer als ein einzelnes massives Muster.
Wenn String-Methoden funktionieren. "hello".startsWith("he") ist klarer als /^he/.
Regex ist ein Tool. Wie jedes Tool ist es gut für spezifische Jobs und umständlich für andere. Beginne einfach, teste während du baust und versuche nicht, clever zu sein. Lesbares Regex ist besser als beeindruckendes Regex.