Utilo

Regex-Cheat Sheet: Muster, Flaggen und Beispiele aus der realen Welt

Ein praktisches Schreibblatt mit Zeichenklassen, Quantifikatoren, Ankern, Gruppen, Lookarounds, Flags und getesteten Mustern für alltägliche Aufgaben.

· 5 Min. Lesezeit

Regelmäßige Ausdrücke sind eine kompakte Sprache zur Beschreibung von Text. Eine einzelne Zeile kann Eingaben validieren, Daten aus Protokollen extrahieren oder Hunderte von Dateien umbenennen. Die Syntax ist jedoch dicht, und kleine Fehler erzeugen Muster, die fast funktionieren. Dieses Cheat Sheet sammelt die Syntax, die Sie täglich verwenden werden, erklärt die Teile, die Menschen stolpern, und endet mit getesteten Mustern, die Sie anpassen können. Alle Beispiele verwenden JavaScript-Syntax, die auch sehr nahe an Python, Java, Go und .NET liegt.

Versuchen Sie jedes Muster in einem Regex-Tester, während Sie lesen; die hervorgehobenen Übereinstimmungen zu sehen, ist der schnellste Weg, um Intuition aufzubauen.

Wörtliche Zeichen und Flucht

Die meisten Charaktere passen sich: cat passt zu "Cat". Zwölf Zeichen haben eine besondere Bedeutung und müssen mit einem Backslash entfernt werden, damit sie buchstäblich übereinstimmen:

. * + ? ^ $ { } ( ) | [ ] \ /

Also entspricht 3.14 "3.14" aber auch "3x14", während 3\.14 nur "3.14" entspricht.

Zeichenklassen

Muster Streichhölzer
. Alle Zeichen mit Ausnahme einer neuen Zeile (es sei denn, die Markierung s ist eingestellt)
\d Eine Ziffer 09
\w Ein Wortzeichen: Buchstabe, Ziffer oder Unterstriche
\s Leerzeichen: Leerzeichen, Registerkarte, neue Zeile
\D, \W, \S Das Gegenteil von oben
[abc] Einer von a, b oder c
[a-z] Jeder kleine ASCII-Buchstabe
[^0-9] Jedes Zeichen, das keine Ziffer ist
\p{L} Jeder Buchstabe in jeder Schrift (erfordert die u-Flagge)

In vierkantigen Klammern verlieren die meisten Sonderzeichen ihre Bedeutung. [.] entspricht einem Buchstabenpunkt. Ein Bindestrich ist buchstäblich, wenn er zuerst oder zuletzt platziert wird: [-a-z].

Quantifikatoren

Muster Bedeutung
a* Null oder mehr
a+ Ein oder mehrere
a? Null oder eins (optional)
a{3} Genau drei .
a{2,5} Zwischen zwei und fünf.
a{2,} Zwei oder mehr

Die Quantifikatoren sind gierig: sie passen so viel wie möglich zusammen und gehen dann zurück. Wenn man ? hinzufügt, sind sie faul. Bei <b>bold</b> entspricht das Muster <.+> der gesamten Zeichenfolge, während <.+?> nur <b> entspricht.

Anker und Grenzen

  • ^ entspricht dem Anfang der Zeichenfolge oder jeder Zeile mit der m-Flagge.
  • $ entspricht dem Ende der Zeichenfolge oder jeder Zeile mit m.
  • \b entspricht einer Wortgrenze: die Position zwischen einem Wortzeichen und einem nicht-Wortzeichen.

\bcat\b stimmt mit "Cat" in "the cat sat" überein, aber nicht mit "concatenate". Anker sind für die Validierung unerlässlich: \d{5} findet fünf Ziffern überall in "abc123456", während ^\d{5}$ verlangt, dass die gesamte Eingabe genau fünf Ziffern beträgt.

Gruppen und Abwechslung

  • (abc)-Gruppen und Fangmengen. Der erfasste Text ist als $1, $2 erhältlich.
  • (?:abc) gruppiert ohne zu erfassen, was schneller ist und die Nummerierung sauber hält.
  • (?<year>\d{4}) ist eine benannte Gruppe, zugänglich als match.groups.year.
  • a|b passt zu A oder B. Alternation hat die niedrigste Priorität, also bedeutet ^cat|dog$ "beginnt mit Katze" oder "endet mit Hund". Verwenden Sie ^(?:cat|dog)$, um genau eines der Wörter zu finden.
  • \1 ist eine Rückverweisung auf Gruppe 1: (\w)\1 findet doppelte Buchstaben wie "ll" in "Hallo".

Schauen Sie sich um.

Lookarounds behaupten, dass etwas neben der aktuellen Position ist oder nicht, ohne Zeichen zu verbrauchen.

Muster Bedeutung
(?=...) Positiv: gefolgt von
(?!...) Negative Aussicht: nicht gefolgt von
(?<=...) Positive lookbehind: vorangestellt von
(?<!...) Negative lookbehind: nicht vorangestellt von

Beispiele: \d+(?=px) entspricht der Zahl in "16px" ohne "px"; (?<=\$)\d+ entspricht dem Betrag nach einem Dollarzeichen; ^(?!.*password).*$ entspricht Zeilen, die kein "Passwort" enthalten.

Flaggen

  • g (global): Finden Sie alle Übereinstimmungen, anstatt bei der ersten anzuhalten.
  • i (Ignorieren): a entspricht "A".
  • m (Multiline): ^ und $ passen bei Linienpausen zusammen.
  • s (dotAll): . passt auch zu Newlines.
  • u (Unicode): behandelt Ersatzpaare wie Emojis als einzelne Zeichen und ermöglicht \p{...}.
  • y (klebrig): Spielt nur an der Position, an der das letzte Spiel endete.

Muster für alltägliche Aufgaben

Diese sind eher praktisch als erschöpfend. Die tatsächliche Validierung sollte mit serverseitigen Kontrollen kombiniert werden.

E-Mail (pragmatisch):

^[^\s@]+@[^\s@]+\.[^\s@]{2,}$

Fängt Tippfehler wie fehlende @ oder Domain; die einzige echte Validierung ist das Senden einer Bestätigungs-E-Mail.

** URL-Schnecke:**

^[a-z0-9]+(?:-[a-z0-9]+)*$

** ISO-Datum (JJJJ-MM-DD):**

^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$

Dies überprüft Form und Bereiche, aber nicht, ob der 31. Februar existiert; analysieren Sie das Datum, um zu bestätigen.

Hexfarbe:

^#(?:[0-9a-fA-F]{3}){1,2}$

IPv4-Adresse:

^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$

** Semantische Version:**

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$

Strenge Passwortprüfung (mindestens 12 Zeichen, ein Kleinbuchstaben, ein Großbuchstaben, eine Ziffer):

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$

** Trim-Weißräume:** Ersetzen Sie ^\s+|\s+$ (mit g) durch eine leere Zeichenfolge.

** Zusammenbruch wiederholter Leerzeichen:** Ersetzen Sie {2,} durch eine einzelne Leerzeichen.

** Schlüssel=Wertpaare aus einer Logzeile extrahieren:**

(\w+)=("[^"]*"|\S+)

** camelCase to snake_case:** Ersetzen Sie ([a-z0-9])([A-Z]) durch $1_$2, und dann das Ergebnis in Kleingedruckter Form. Weitere Informationen zu Namensformen finden Sie unter [camelCase vs snake_case] (WEB /blog/naming-conventions-camelcase-snake-case).

Leistung und Katastrophenrückverfolgung

Regex-Engines in JavaScript, Python und Java verwenden Backtracking. Einige Muster zwingen den Motor, eine exponentielle Anzahl von Kombinationen an Eingängen auszuprobieren, die fast übereinstimmen. Das klassische Beispiel ist ^(a+)+$ gegen "aaaaaaaaaaaaaaaaaaaa!". Jedes zusätzliche "a" verdoppelt die Arbeit, und ein paar Dutzend Zeichen können einen Server einfrieren ein Denial-of-Service-Vektor, bekannt als ReDoS.

Um es zu vermeiden:

  • Nische keine Quantifikatoren über die gleichen Zeichen wie in (a+)+ oder (\w*)*.
  • Alternativen gegenseitig ausschließend machen: (a|ab)* ist riskant; umstrukturieren.
  • Bevorzugung spezifischer Klassen gegenüber .*: "[^"]*" ist sicherer und schneller als ".*?".
  • Begrenzen Sie die Eingabelänge, bevor Sie nicht vertrauenswürdige Daten abwägen.

Lesbarkeitstipps

  • Bauen Sie komplexe Muster schrittweise und testen Sie jedes Stück.
  • Verwenden Sie benannte Gruppen, damit der Code m.groups.month und nicht m[2] liest.
  • Kommentieren Sie komplizierte Muster im Code oder bauen Sie sie aus kleineren Zeichenfolgen auf.
  • Wenn ein Muster mehr als ein oder zwei Zeilen benötigt, sollten Sie prüfen, ob ein kleiner Parser klarer wäre.

Zusammenfassung

Lernen Sie die Kernklassen, Quantifikatoren, Anker, Gruppen und Flaggen kennen und Sie können die meisten Regexen lesen, die Sie treffen. Verwenden Sie faule Quantifikatoren und Anker absichtlich, greifen Sie nach Lookarounds, wenn Sie den Kontext benötigen, ohne ihn zu verbrauchen, achten Sie auf verschachtelte Quantifikatoren und testen Sie immer sowohl passende als auch nicht passende Beispiele, bevor Sie ein Muster versenden.

Diese Seite wurde automatisch aus dem Englischen übersetzt. Wenn dir ein Fehler auffällt, sag uns bitte Bescheid.

Verwandte Ratgeber