Reguläre Ausdrücke für Einsteiger: Muster, die wirklich Sinn ergeben
Eine freundliche Einführung in die Regex-Syntax, gängige Muster zur Validierung und Suche sowie Tipps zum frustrationsfreien Testen von Ausdrücken.
Reguläre Ausdrücke (Regex) gelten als schwer lesbar. Aber sobald man die Grundbausteine kennt, werden sie zu einem der mächtigsten Werkzeuge im Werkzeugkasten eines Entwicklers – von der Validierung von Benutzereingaben bis hin zur Suche in Log-Dateien.
Was ist ein regulärer Ausdruck?
Ein Regex ist ein Muster, das eine Menge von Zeichenketten beschreibt. Man gibt der Regex-Engine ein Muster und eine Zielzeichenkette; sie sagt einem, ob (und wo) das Muster übereinstimmt.
const pattern = /hello/i;
pattern.test("Hello World"); // true
Das /i-Flag macht den Vergleich groß-/kleinschreibungsunabhängig. Flags stehen in JavaScript nach dem schließenden /.
Wesentliche Grundbausteine
| Symbol | Bedeutung | Beispiel | Treffer |
|---|---|---|---|
. |
Beliebiges Zeichen (außer Zeilenumbruch) | h.t |
hat, hit, hot |
* |
Null oder mehr des Vorherigen | ab*c |
ac, abc, abbc |
+ |
Ein oder mehr des Vorherigen | ab+c |
abc, abbc (nicht ac) |
? |
Null oder eins des Vorherigen | colou?r |
color, colour |
\d |
Beliebige Ziffer (0–9) | \d{3} |
123, 007 |
\w |
Wortzeichen (Buchstabe, Ziffer, _) | \w+ |
hello, user_1 |
\s |
Leerzeichen (Leerzeichen, Tab, Zeilenumbruch) | \s+ |
trifft Leerzeichen |
^ |
Anfang der Zeichenkette | ^Hello |
Hello… |
$ |
Ende der Zeichenkette | world$ |
…world |
Zeichenklassen
Eckige Klammern definieren eine Menge von Zeichen, auf die gematcht werden soll:
[aeiou] — beliebiger Vokal
[A-Z] — beliebiger Großbuchstabe
[0-9a-f] — beliebige Hex-Ziffer
[^0-9] — alles, was KEINE Ziffer ist
Gruppen und Alternativen
Klammern gruppieren Teile eines Musters, und | bedeutet „oder":
(cat|dog)s? — trifft cat, cats, dog, dogs
(\d{3})-(\d{4}) — trifft 555-1234 und erfasst jeden Teil
Erfasste Gruppen sind nützlich zur Extraktion – um Telefonnummern, Datumsangaben oder IDs aus unstrukturiertem Text herauszuziehen.
Gängige Muster aus der Praxis
E-Mail (vereinfacht)
^[^\s@]+@[^\s@]+\.[^\s@]+$
Dies prüft auf „etwas @ etwas . etwas" – gut genug für die clientseitige Validierung. Für den Produktionseinsatz empfiehlt sich eine echte Zustellungsprüfung mit unserem Email Validator.
URL
https?:\/\/[^\s/$.?#].[^\s]*
Trifft sowohl http- als auch https-URLs. Zum Erstellen gültiger URLs siehe den URL & Query String Builder.
Telefonnummer (US)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Trifft Formate wie (555) 123-4567, 555.123.4567 und 555-123-4567.
Datum (YYYY-MM-DD)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
Regex debuggen
Der beste Weg zu lernen ist interaktives Testen. Füge dein Muster und eine Beispielzeichenkette in unseren Regex Tester ein – er hebt Treffer in Echtzeit hervor, zeigt erfasste Gruppen an und erklärt, was jeder Teil deines Musters bewirkt.
Schreibe das einfachste Muster, das dein Problem löst. „Clevere" Regexes sind schwer zu warten.
Performance-Fallstricke
Katastrophales Backtracking
Verschachtelte Quantoren wie (a+)+b können dazu führen, dass die Engine bei nicht übereinstimmenden Eingaben eine exponentielle Anzahl von Pfaden ausprobiert. Vermeide Muster, bei denen dieselben Zeichen von mehreren Teilen des Ausdrucks gematcht werden können.
Verankerung spart Zeit
Wenn du weißt, dass dein Muster die gesamte Zeichenkette treffen soll, verwende ^ und $. Ohne Anker durchsucht die Engine jede Position in der Zeichenkette nach einem partiellen Treffer.
Kurzübersicht als Spickzettel
. beliebiges Zeichen
\d \D Ziffer / Nicht-Ziffer
\w \W Wortzeichen / Nicht-Wortzeichen
\s \S Leerzeichen / kein Leerzeichen
[abc] Zeichenmenge
[^abc] negierte Menge
(group) erfassende Gruppe
(?:group) nicht-erfassende Gruppe
a{3} genau 3
a{2,5} zwischen 2 und 5
a*? a+? lazy (nicht-gierige) Varianten
(?=ahead) positiver Lookahead
(?!ahead) negativer Lookahead
Regex ist eine Fertigkeit, die sich aufbaut. Beginne mit einfachen Mustern, teste sie visuell und erhöhe die Komplexität nur bei Bedarf. Jede Programmiersprache unterstützt Regex – einmal gelernt, ist die Syntax überall einsetzbar.