Tutorial zu regulären Ausdrücken: Ein anfängerfreundlicher Leitfaden zu Regex

· 12 Min. Lesezeit

Inhaltsverzeichnis

Was sind reguläre Ausdrücke und warum sollte man sie lernen?

Reguläre Ausdrücke (häufig als Regex oder Regexp abgekürzt) sind leistungsstarke Musterabgleichswerkzeuge, mit denen Sie Text mithilfe einer speziellen Syntax suchen, validieren, extrahieren und bearbeiten können. Stellen Sie sie sich als eine ausgefeilte Suchsprache vor, die weit über einfache „Suchen und Ersetzen"-Operationen hinausgeht.

Stellen Sie sich vor, Sie müssen alle E-Mail-Adressen aus einer Datei mit Tausenden von Zeilen Protokolldaten extrahieren oder überprüfen, ob die Telefonnummer eines Benutzers dem richtigen Format entspricht. Die Verwendung herkömmlicher Methoden zur Zeichenkettenmanipulation würde zu ausführlichem, schwer wartbarem Code führen. Reguläre Ausdrücke können diese Aufgaben mit einem einzigen, prägnanten Muster bewältigen.

Im Kern definieren reguläre Ausdrücke Suchmuster unter Verwendung einer Kombination aus literalen Zeichen und speziellen Metazeichen. Diese Muster können einfache Zeichenketten wie „cat" oder komplexe Strukturen wie E-Mail-Adressen, URLs oder Kreditkartennummern abgleichen.

Warum sollten Sie reguläre Ausdrücke lernen?

Anwendungen in der Praxis

Reguläre Ausdrücke werden in der Softwareentwicklung und Datenverarbeitung umfassend eingesetzt:

Profi-Tipp: Obwohl Regex leistungsstark ist, ist es nicht immer das beste Werkzeug für jede Aufgabe. Verwenden Sie zum Parsen komplexer strukturierter Daten wie HTML oder JSON dedizierte Parser. Regex funktioniert am besten für Musterabgleich in reinem Text.

Grundlegende Syntax und Grundlagen

Reguläre Ausdrücke bestehen aus zwei Arten von Zeichen: literalen Zeichen (die sich selbst entsprechen) und Metazeichen (die spezielle Bedeutungen haben). Beginnen wir mit den Grundlagen.

Literale Zeichen

Der einfachste Regex ist einfach nur reiner Text. Das Muster cat entspricht der exakten Zeichenkette „cat" in Ihrem Text.

Text: "The cat sat on the mat"
Regex: cat
Entspricht: "The cat sat on the mat"

Literale Zeichen unterscheiden standardmäßig zwischen Groß- und Kleinschreibung, sodass cat nicht „Cat" oder „CAT" entspricht, es sei denn, Sie verwenden ein Flag für Groß-/Kleinschreibung-Unabhängigkeit.

Das Punkt-Metazeichen (.)

Der Punkt . ist ein Platzhalter, der jedem einzelnen Zeichen außer Zeilenumbruchzeichen entspricht.

Text: "cat", "cot", "cut", "c@t"
Regex: c.t
Entspricht: Allen vier Zeichenketten

Um einem literalen Punktzeichen zu entsprechen, maskieren Sie es mit einem Backslash: \.

Text: "file.txt"
Regex: file\.txt
Entspricht: "file.txt" (nicht "fileAtxt")

Anker: Positionen abgleichen

Anker entsprechen keinen Zeichen – sie entsprechen Positionen im Text.

Zirkumflex (^) - Zeilenanfang: Der ^-Anker entspricht dem Anfang einer Zeichenkette oder Zeile.

Text: "cat\ndog\ncat"
Regex: ^cat
Entspricht: Nur dem ersten "cat"

Dollarzeichen ($) - Zeilenende: Der $-Anker entspricht dem Ende einer Zeichenkette oder Zeile.

Text: "cat\ndog\ncat"
Regex: cat$
Entspricht: Nur dem letzten "cat"

Anker kombinieren: Verwenden Sie beide, um ganze Zeilen abzugleichen.

Regex: ^cat$
Entspricht: Nur Zeilen, die genau "cat" enthalten, ohne etwas davor oder danach

Wortgrenzen (\b)

Der \b-Anker entspricht Wortgrenzen – Positionen zwischen Wort- und Nicht-Wort-Zeichen.

Text: "cat category caterpillar"
Regex: \bcat\b
Entspricht: Nur dem eigenständigen Wort "cat"

Dies ist unglaublich nützlich, um ganze Wörter zu finden, ohne Teilwörter abzugleichen.

Escape-Sequenzen

Sonderzeichen in Regex müssen mit einem Backslash maskiert werden, um ihnen literal zu entsprechen:

Sonderzeichen Maskierte Form
. * + ? ^ $ { } [ ] ( ) | \ \. \* \+ \? \^ \$ \{ \} \[ \] \( \) \| \\

Beispiel für das Abgleichen eines Preises:

Regex: \$\d+\.\d{2}
Entspricht: "$19.99", "$5.00"

Zeichenklassen und Bereiche

Zeichenklassen ermöglichen es Ihnen, eine Menge von Zeichen zu definieren und einem beliebigen davon zu entsprechen. Sie werden in eckige Klammern eingeschlossen.

Grundlegende Zeichenklassen

Eckige Klammern [] erstellen eine Zeichenmenge, die jedem einzelnen Zeichen darin entspricht.

Text: "cat", "cot", "cut", "cit"
Regex: c[aou]t
Entspricht: "cat", "cot", "cut" (nicht "cit")

Zeichenbereiche

Verwenden Sie Bindestriche, um Bereiche von Zeichen zu definieren:

Text: "a1", "b2", "c3", "d4"
Regex: [a-c][1-3]
Entspricht: "a1", "b2", "c3" (nicht "d4")

Negierte Zeichenklassen

Verwenden Sie ein Zirkumflex ^ am Anfang einer Zeichenklasse, um sie zu negieren – entspricht jedem Zeichen, das NICHT in der Menge ist.

Regex: [^0-9]
Entspricht: Jedem Zeichen, das KEINE Ziffer ist
Text: "abc123def"
Regex: [^a-z]+
Entspricht: "123" (die Sequenz von Nicht-Kleinbuchstaben)

Vordefinierte Zeichenklassen

Regex bietet Kurzschreibweisen für häufige Zeichenklassen:

Kurzform Äquivalent Beschreibung
\d [0-9] Jede Ziffer
\D [^0-9] Jede Nicht-Ziffer
\w [a-zA-Z0-9_] Jedes Wortzeichen
\W [^a-zA-Z0-9_] Jedes Nicht-Wortzeichen
\s [ \t\n\r\f\v] Jedes Leerzeichen
\S [^ \t\n\r\f\v] Jedes Nicht-Leerzeichen

Beispiel für das Abgleichen einer einfachen Telefonnummer:

Regex: \d{3}-\d{3}-\d{4}
Entspricht: "555-123-4567"

Schneller Tipp: Großgeschriebene Versionen von Kurzschreibweisen sind immer die Negation ihrer kleingeschriebenen Gegenstücke. \d entspricht Ziffern, \D entspricht Nicht-Ziffern.

Quantifizierer: Wiederholungen steuern

Quantifizierer geben an, wie oft ein Zeichen oder eine Gruppe abgeglichen werden soll. Sie werden nach dem Element platziert, das Sie wiederholen möchten.

Grundlegende Quantifizierer

Beispiele für Quantifizierer in Aktion

Sternchen (*) - Null oder mehr:

Regex: ca*t
Entspricht: "ct", "cat", "caat", "caaat"

Plus (+) - Ein oder mehr:

Regex: ca+t
Entspricht: "cat", "caat", "caaat" (nicht "ct")

Fragezeichen (?) - Optional:

Regex: colou?r
Entspricht: "color" und "colour"

Genaue Anzahl {n}:

Regex: \d{3}
Entspricht: Genau drei Ziffern wie "123"

Bereich {n,m}:

Regex: \d{2,4}
Entspricht: 2 bis 4 Ziffern wie "12", "123" oder "1234"

Gierige vs. genügsame Quantifizierer

Standardmäßig sind Quantifizierer gierig – sie entsprechen so viel Text wie möglich. Das Hinzufügen von ? nach einem Quantifizierer macht ihn genügsam (entspricht so wenig wie möglich).

Text: "<div>content</div><div>more</div>"
Regex (gierig): <div>.*</div>
Entspricht: "<div>content</div><div>more</div>" (gesamte Zeichenkette)

Regex (genügsam): <div>.*?</div>
Entspricht: "<div>content</div>" (nur erstes Tag)

Genügsame Quantifizierer:

Profi-Tipp: Gieriges Matching kann bei großen Texten zu Leistungsproblemen führen. Verwenden Sie genügsame Quantifizierer, wenn Sie die kürzestmögliche Zeichenkette abgleichen müssen, insbesondere bei der Arbeit mit verschachtelten Strukturen.

Praktisches Beispiel: HTML-Tags abgleichen

Regex: <([a-z]+)>.*?</\1>
Entspricht: Gepaarten HTML-Tags wie "<p>text</p>" oder "<div>content</div>"

Dieses Muster verwendet genügsames Matching, um zu vermeiden, mehrere Tags auf einmal zu erfassen, und Rückverweise (als nächstes behandelt), um sicherzustellen, dass öffnende und schließende Tags übereinstimmen.

Gruppen und Erfassung

Klammern () erstellen Gruppen, die mehreren Zwecken dienen: Sie gruppieren Teile eines Musters zusammen, erfassen übereinstimmenden Text zur späteren Verwendung und ermöglichen Rückverweise.

Grundlegende Gruppierung

Gruppen ermöglichen es Ihnen, Quantifizierer auf mehrere Zeichen anzuwenden:

Regex: (ha)+
Entspricht: "ha", "haha", "hahaha"

Ohne Gruppierung würde ha+ „ha", „haa", „haaa" entsprechen (nur das 'a' wiederholt sich).

Erfassungsgruppen

Gruppen erfassen automatisch den Text, dem sie entsprechen, auf den Sie später verweisen können:

Text: "John Smith"
Regex: (\w+) (\w+)
Erfasst: Gruppe 1 = "John", Gruppe 2 = "Smith"

In den meisten Programmiersprachen können Sie auf diese Erfassungen zugreifen:

// JavaScript-Beispiel
const match = "John Smith".match(/(\w+) (\w+)/);
console.log(match[1]); // "John"
console.log(match[2]); // "Smith"

Rückverweise

Rückverweise ermöglichen es Ihnen, demselben Text zu entsprechen, der zuvor im Muster von einer Gruppe erfasst wurde. Verwenden Sie \1, \2 usw.

Regex: (\w+) \1
Entspricht: Wiederholten Wörtern wie "the the" oder "is is"
Regex: <([a-z]+)>.*?</\1>
Entspricht: Übereinstimmenden HTML-Tags wie "<div>...</div>"

Nicht-erfassende Gruppen

Manchmal benötigen Sie Gruppierung ohne Erfassung. Verwenden Sie (?:...) für nicht-erfassende Gruppen:

Regex: (?:https?|ftp)://\S+
Entspricht: URLs, die mit http, https oder ftp beginnen
(Das Protokoll wird nicht als Gruppe erfasst)

Nicht-erfassende Gruppen verbessern die Leistung, wenn Sie nicht auf den erfassten Text verweisen müssen.

Benannte Erfassungsgruppen

Benannte Gruppen machen Ihren Regex lesbarer und wartbarer:

Regex: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Entspricht: Daten wie "2026-03-31"
Zugriff: match.groups.year, match.groups.month, match.groups.day

Benannte Gruppen sind besonders nützlich in komplexen Mustern, bei denen nummerierte Verweise verwirrend werden.

Schneller Tipp: Verwenden Sie benannte Gruppen für komplexe