Reguläre Ausdrücke (Regex) bieten eine kompakte Notation, um komplexe Textmuster in Zeichenketten, Konfigurationsdateien und Logfiles zu durchsuchen und zu validieren.
1. Grundlagen der Regex-Grammatik
Regex-Muster prüfen Zeichen entweder wörtlich (z. B. abc) oder über Metazeichen, die Zeichenklassen repräsentieren:
\d: Jede Ziffer (0-9).\w: Jedes Wortzeichen (Buchstaben, Ziffern, Unterstrich).\s: Jedes Whitespace-Zeichen (Leerzeichen, Tabs, Umbrüche).[a-z0-9]: Benutzerdefinierte Zeichenklassen.
2. Gierige vs. genügsame Quantifikatoren
Standardmäßig sind Quantifikatoren wie * und + gierig (greedy) und erfassen den maximal möglichen Text. Ein angehängtes Fragezeichen (*?, +?) macht sie genügsam (lazy), sodass sie die kürzeste Übereinstimmung wählen.
3. Lookahead- und Lookbehind-Assertionen
Nullbreiten-Assertionen prüfen Kontextbedingungen, ohne Zeichen aus der Zeichenkette zu konsumieren:
(?=...)Positives Lookahead: Trifft zu, wenn das Muster folgt.(?!...)Negatives Lookahead: Trifft zu, wenn das Muster NICHT folgt.(?<=...)Positives Lookbehind: Trifft zu, wenn das Muster vorausgeht.(?<!...)Negatives Lookbehind: Trifft zu, wenn das Muster NICHT vorausgeht.
4. Vermeidung katastrophalen Backtrackings (ReDoS)
Verschachtelte Quantifikatoren (z. B. ([a-zA-Z]+)+$) bei nicht passenden Texten lassen die Prüfzeit exponentiell wachsen (O(2^n)), blockieren Server-Threads und führen zu Denial-of-Service (ReDoS).