🔍 Reguläre Ausdrücke
Muster in Texten suchen, prüfen, extrahieren und ersetzen – Schritt für Schritt erklärt und mit einem interaktiven Regex-Tester zum direkten Ausprobieren.
🛠️ Empfohlene Tools für Entwickler
Diese Tools nutze ich selbst – sie helfen Ihnen, Ihre Projekte professionell umzusetzen und zu vermarkten.
⚡ ExeOutput for PHP
PHP-Anwendungen in eigenständige Windows-EXE-Dateien kompilieren – auch für Regex-basierte Textverarbeitung ideal.
Jetzt ansehen →📄 HTML Executable
HTML-Dateien und Websites als eigenständige Windows-EXE-Dateien kompilieren.
Jetzt ansehen →🔒 XLS Padlock
Excel-Arbeitsmappen als EXE kompilieren und schützen – perfekt für datenbank-gestützte Excel-Lösungen mit Textverarbeitung.
Jetzt ansehen →🐍 VBA Padlock
VBA-Code kompilieren und Office-Lösungen verkaufen – ohne Source-Code-Weitergabe.
Jetzt ansehen →📦 Paquet Builder
Professionelle Windows-Installationsprogramme für Ihre Anwendungen erstellen.
Jetzt ansehen →* Affiliate-Links: Bei einem Kauf über diese Links erhalten wir eine kleine Provision – für Sie entstehen keine zusätzlichen Kosten.
1. Was ist ein regulärer Ausdruck?
Ein regulärer Ausdruck, kurz Regex, beschreibt ein Textmuster. Programme können damit Zeichenfolgen suchen, prüfen, extrahieren, aufteilen oder ersetzen.
Suchen
Alle Postleitzahlen, Datumsangaben oder Produktnummern in einem Text finden.
Prüfen
Kontrollieren, ob eine Eingabe ein gewünschtes Format vollständig erfüllt.
Ersetzen
Mehrfache Leerzeichen vereinheitlichen oder Bestandteile eines Textes neu anordnen.
Ein erstes Muster
^\d{5}$
Das Muster bedeutet: Beginn der Eingabe (^), genau fünf Ziffern (\d{5}) und danach sofort das Ende ($). Es prüft das Format, aber nicht, ob die Postleitzahl tatsächlich vergeben ist.
2. Regex-Varianten verstehen
Reguläre Ausdrücke sehen in vielen Werkzeugen ähnlich aus, sind aber nicht vollständig identisch. JavaScript, Python, PHP, Java, .NET, Texteditoren und Kommandozeilenprogramme verwenden jeweils eine bestimmte Regex-Variante oder „Flavor“.
Gemeinsame Grundlagen
Zeichenklassen, Gruppen, Alternativen, Quantifizierer und Anker funktionieren in vielen Varianten sehr ähnlich.
Unterschiedliche Details
Flags, Unicode-Verhalten, benannte Gruppen, Lookbehind und Ersetzungssyntax können sich unterscheiden.
3. Zeichen und Zeichenklassen
Ein normales Zeichen steht meistens für sich selbst. Metazeichen besitzen eine besondere Bedeutung und müssen mit einem Backslash maskiert werden, wenn sie wörtlich gesucht werden sollen.
Beliebiges Zeichen
Passt normalerweise auf ein Zeichen außer einem Zeilenumbruch.
Ziffer
Findet je nach Regex-Variante eine Ziffer; in JavaScript typischerweise 0 bis 9.
Nicht-Ziffer
Das Gegenstück zu \d.
Leerraum
Passt unter anderem auf Leerzeichen, Tabulatoren und Zeilenumbrüche.
Nicht-Leerraum
Das Gegenstück zu \s.
Wortzeichen
In JavaScript vor allem Buchstaben A–Z, Ziffern und Unterstrich; Umlaute sind nicht zuverlässig enthalten.
Auswahl
Passt auf genau eines der Zeichen a, b oder c.
Negierte Auswahl
Passt auf ein Zeichen, das nicht a, b oder c ist.
Bereich
Passt auf eine Ziffer zwischen 0 und 9.
Sonderzeichen wörtlich suchen
| Gesuchter Text | Regex | Erklärung |
|---|---|---|
| Punkt | \. | Ohne Backslash würde der Punkt für ein beliebiges Zeichen stehen. |
| Fragezeichen | \? | Ohne Maskierung ist es ein Quantifizierer. |
| Runde Klammer | \( und \) | Ohne Maskierung bilden Klammern eine Gruppe. |
| Backslash | \\ | Der erste Backslash maskiert den zweiten. |
Unicode-Buchstaben in JavaScript
\p{L}+
Mit dem Flag u findet \p{L} Unicode-Buchstaben und erfasst damit auch Wörter wie „Göçmen“, „München“ oder „Crème“ besser als [A-Za-z]+.
4. Quantifizierer – wie oft darf etwas vorkommen?
Quantifizierer beziehen sich auf das direkt vorherige Zeichen, die Zeichenklasse oder die Gruppe.
| Syntax | Bedeutung | Beispiel |
|---|---|---|
* | Nullmal oder öfter | ab*c passt auf ac, abc, abbc. |
+ | Einmal oder öfter | ab+c passt nicht auf ac. |
? | Nullmal oder einmal | colou?r passt auf color und colour. |
{n} | Genau n-mal | \d{5} findet fünf Ziffern. |
{n,} | Mindestens n-mal | \w{3,} findet mindestens drei Wortzeichen. |
{n,m} | Zwischen n- und m-mal | \d{2,4} findet zwei bis vier Ziffern. |
Gierig, zurückhaltend und besitzergreifend
# Gierig: nimmt möglichst viel
".*"
# Zurückhaltend: nimmt möglichst wenig
".*?"
# Possessiv: nimmt möglichst viel ohne Backtracking
".*+"
Im Text "eins" und "zwei" kann das gierige Muster vom ersten bis zum letzten Anführungszeichen reichen. Die zurückhaltende Variante beendet den Treffer am frühesten möglichen passenden Anführungszeichen. Der possessive Quantifizierer *+ nimmt so viel wie möglich und gibt nichts zurück – das kann in bestimmten Fällen die Performance verbessern, verändert aber das Suchergebnis.
.*? kann für Text in Anführungszeichen häufig "[^"\r\n]*" verwendet werden. Das Muster beschreibt genauer, welche Zeichen erlaubt sind.
5. Anker und Wortgrenzen
Anker konsumieren normalerweise kein Zeichen. Sie prüfen eine Position innerhalb des Textes.
Anfang
Prüft den Beginn des Textes oder mit m den Beginn einer Zeile.
Ende
Prüft das Ende des Textes oder mit m das Ende einer Zeile.
Wortgrenze
Prüft eine Grenze zwischen Wort- und Nicht-Wortzeichen.
Keine Wortgrenze
Prüft eine Position, die keine Wortgrenze ist.
Suchen oder vollständig validieren?
Im Text suchen
\d{5}Findet fünf Ziffern auch innerhalb eines längeren Textes.
Gesamte Eingabe prüfen
^\d{5}$Akzeptiert nur eine Eingabe, die vollständig aus genau fünf Ziffern besteht.
\b am Begriff des Wortzeichens \w. Bei Sprachen mit Umlauten oder anderen Schriftsystemen kann das Ergebnis deshalb anders ausfallen als erwartet.
6. Gruppen und Alternativen
Gruppen fassen Teile eines Musters zusammen. Sie können wiederholt, als Alternative verwendet oder später als Trefferbestandteil ausgelesen werden.
| Syntax | Aufgabe | Beispiel |
|---|---|---|
(abc) | Erfassende Gruppe | Speichert den Treffer der Gruppe für spätere Verwendung. |
(?:abc) | Nicht erfassende Gruppe | Gruppiert, ohne einen nummerierten Gruppenwert anzulegen. |
a|b | Alternative | Passt auf a oder b. |
(rot|grün|blau) | Gruppierte Auswahl | Passt auf genau eines der drei Wörter. |
(?<name>...) | Benannte Gruppe | Gibt einer Gruppe in unterstützten Varianten einen sprechenden Namen. |
(*PRUNE) | Backtracking-Kontrolle | Unterbricht Backtracking an dieser Stelle (PCRE/Perl). |
Beispiel: Datum in Teile zerlegen
^(?<tag>\d{2})\.(?<monat>\d{2})\.(?<jahr>\d{4})$
Bei 13.08.2026 enthält die Gruppe tag den Wert 13, monat den Wert 08 und jahr den Wert 2026. Das Muster prüft jedoch noch nicht, ob das Datum im Kalender existiert.
(?:...), wenn du nur gruppieren möchtest. Benannte Gruppen erleichtern das Verständnis, wenn Werte später ausgelesen werden.
7. Lookaround und Rückverweise
Diese Techniken sind nützlich, aber nicht in jeder Regex-Variante gleich verfügbar. Prüfe deshalb die Unterstützung in deiner Zielumgebung.
| Syntax | Bezeichnung | Bedeutung |
|---|---|---|
(?=...) | Positiver Lookahead | Danach muss das beschriebene Muster folgen. |
(?!...) | Negativer Lookahead | Danach darf das beschriebene Muster nicht folgen. |
(?<=...) | Positiver Lookbehind | Davor muss das beschriebene Muster stehen. |
(?<!...) | Negativer Lookbehind | Davor darf das beschriebene Muster nicht stehen. |
\1 bis \99 | Rückverweis | Verlangt erneut denselben Text wie in der ersten erfassenden Gruppe. |
${1} / $1 | Ersetzung mit Gruppe | Verwendet den Inhalt der Gruppe in der Ersetzung. |
🎯 Live-Demo: Lookaround in Aktion
Doppeltes Wort finden
\b(\p{L}+)\s+\1\b
Mit den Flags g, i und u kann dieses JavaScript-Muster beispielsweise „die die“ finden. Gruppe 1 speichert das erste Wort; \1 verlangt danach denselben Text erneut.
Zahl nach einem Eurozeichen finden
(?<=€)\d+(?:,\d{2})?
8. Erweiterte Regex-Konzepte
Atomic Groups – Backtracking verhindern
# Normale Gruppe (Backtracking erlaubt)
(abc|ab)c
# Atomic Group (kein Backtracking)
(?>abc|ab)c
Atomic Groups (?>...) verhindern, dass die Regex-Engine nach einem Match innerhalb der Gruppe zurückgeht und andere Alternativen ausprobiert. Das kann die Performance verbessern und unerwartete Matches verhindern.
Possessive Quantifizierer
| Quantifizierer | Bedeutung | Beispiel |
|---|---|---|
*+ | Nullmal oder öfter (possessiv) | .*+ |
++ | Einmal oder öfter (possessiv) | .++ |
?+ | Nullmal oder einmal (possessiv) | .?+ |
{n,m}+ | Zwischen n- und m-mal (possessiv) | \d{2,4}+ |
Possessive Quantifizierer nehmen so viel wie möglich und geben nichts zurück – sie verbessern oft die Performance, können aber das Suchergebnis verändern.
🎯 Live-Demo: Possessive Quantifizierer
Vergleiche gierigen und possessiven Quantifizierer:
9. Flags und Suchmodi
Flags verändern die Arbeitsweise eines Musters. Die Schreibweise und Verfügbarkeit hängt von der verwendeten Programmiersprache ab.
| Flag | Name | Wirkung in JavaScript |
|---|---|---|
g | global | Sucht alle Treffer statt nur des ersten. |
i | ignore case | Ignoriert Groß- und Kleinschreibung. |
m | multiline | ^ und $ beziehen sich zusätzlich auf einzelne Zeilen. |
s | dot all | Der Punkt . passt auch auf Zeilenumbrüche. |
u | unicode | Verarbeitet das Muster im Unicode-Modus und ermöglicht Unicode-Eigenschaften wie \p{L}. |
y | sticky | Sucht genau an der aktuellen Position lastIndex. |
const muster = /\p{L}+/giu;
g ist für alle Treffer nützlich, kann aber das Verhalten bestimmter JavaScript-Methoden beeinflussen. u ist bei modernen Unicode-Mustern häufig sinnvoll.
10. Praxisnahe Regex-Muster
Die folgenden Muster prüfen hauptsächlich die Form einer Eingabe. Eine fachliche Gültigkeit muss oft zusätzlich im Programm oder über eine externe Bestätigung geprüft werden.
📧 Einfache E-Mail-Form
^[^\s@]+@[^\s@]+\.[^\s@]+$Prüft pragmatisch auf Text, ein @, weiteren Text, einen Punkt und einen abschließenden Teil.
🏠 Deutsche PLZ als Format
^\d{5}$Erlaubt genau fünf Ziffern. Ob die Postleitzahl vergeben ist, wird nicht geprüft.
📅 Datum TT.MM.JJJJ
\b(?:0[1-9]|[12]\d|3[01])\.(?:0[1-9]|1[0-2])\.\d{4}\bBegrenzt Tag und Monat grob, erkennt aber beispielsweise weiterhin den 31.02.
📞 Flexible Telefonnummer
^\+?[0-9][0-9 ()/-]{6,}$Erlaubt eine optionale internationale Kennung und häufig verwendete Trennzeichen. Die Nummer wird nicht auf Erreichbarkeit geprüft.
🏷️ Einfacher Produktcode
^[A-Z]{3}-\d{4}$Prüft drei Großbuchstaben, einen Bindestrich und vier Ziffern.
🧹 Mehrfache Leerzeichen
[ \t]{2,}Findet mindestens zwei aufeinanderfolgende Leerzeichen oder Tabulatoren, ohne Zeilenumbrüche zu erfassen.
📖 ISBN-10/13
\b(?:97[89])?\d{9}[\dX]\bFindet ISBN-Nummern (10 oder 13-stellig).
🔢 UUID
\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\bFindet UUIDs (Universally Unique Identifier).
🎨 Hex-Farbe
#?[0-9a-f]{6}(?:[0-9a-f]{2})?\bFindet Hex-Farbcodes (3, 6 oder 8-stellig).
🌐 IPv4-Adresse
\b(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\bPrüft IPv4-Adressen grob auf das richtige Format.
11. Suchen, extrahieren und ersetzen
Regex wird besonders nützlich, wenn gefundene Gruppen in einem neuen Text wiederverwendet werden.
Namen umstellen
Suchen: ^(\p{L}+)\s+(\p{L}+)$
Ersetzen: $2, $1
Eingabe: Murat Göçmen
Ausgabe: Göçmen, Murat
In JavaScript steht $1 für die erste und $2 für die zweite erfassende Gruppe. Andere Programme können eine abweichende Ersetzungssyntax verwenden.
🎯 Live-Demo: Ersetzung mit Gruppen
Mehrfache Zwischenräume reduzieren
Suchen: [ \t]{2,}
Ersetzen: ein einzelnes Leerzeichen
Wichtige Ersetzungswerte in JavaScript
| Syntax | Bedeutung |
|---|---|
$& | Der vollständige Treffer. |
$1 bis $99 | Der Inhalt einer nummerierten erfassenden Gruppe. |
$<name> | Der Inhalt einer benannten Gruppe. |
$$ | Ein wörtliches Dollarzeichen. |
$` | Der Text vor dem Treffer. |
$' | Der Text nach dem Treffer. |
12. Regex in JavaScript und Python
JavaScript: suchen und ersetzen
const text = "Köln 50667, Berlin 10115";
const plzMuster = /\b\d{5}\b/g;
const treffer = text.match(plzMuster);
console.log(treffer); // ["50667", "10115"]
const markiert = text.replace(plzMuster, "[PLZ: $&]");
console.log(markiert);
JavaScript: dynamisches Muster
const muster = new RegExp("\\d{5}", "g");
In einem JavaScript-String muss der Backslash selbst maskiert werden. Deshalb wird aus dem Regex-Text \d{5} im String "\\d{5}". Bei einem Regex-Literal wie /\d{5}/g ist diese zusätzliche String-Maskierung nicht nötig.
Python: suchen und Gruppen auslesen
import re
text = "Köln 50667, Berlin 10115"
plz_muster = re.compile(r"\b\d{5}\b")
treffer = plz_muster.findall(text)
print(treffer) # ['50667', '10115']
markiert = plz_muster.sub(r"[PLZ: \g<0>]", text)
print(markiert)
In Python sind rohe Strings mit dem Präfix r für Regex meist leichter lesbar, weil Backslashes nicht zusätzlich als normale String-Escapes verarbeitet werden.
re.escape(); in JavaScript muss eine passende Escape-Funktion für Regex-Sonderzeichen eingesetzt werden.
13. Interaktiver Regex-Tester
Der Tester verwendet JavaScript-RegExp. Wähle ein Beispiel oder gib dein eigenes Muster ein. Fehlerhafte Muster werden abgefangen und als Hinweis angezeigt.
14. Leistung, Wartbarkeit und Sicherheit
Ein korrekt wirkendes Muster kann bei ungünstiger Struktur und sehr langen Eingaben unnötig langsam werden. Das ist besonders relevant, wenn Texte von außen stammen.
Präzise Klassen
Beschreibe erlaubte Zeichen möglichst konkret, statt überall .* einzusetzen.
Eingaben begrenzen
Begrenze Länge und Umfang unkontrollierter Eingaben, bevor komplexe Muster darauf angewendet werden.
Grenzfälle testen
Teste gültige, ungültige, leere, sehr lange und absichtlich schwierige Eingaben.
Problematische Verschachtelung vermeiden
# Unnötig verschachtelt und potenziell teuer
^(a+)+$
# Für dieselbe einfache Aussage klarer
^a+$
Wann Regex nicht die beste Wahl ist
- Komplex verschachteltes HTML oder XML sollte mit einem passenden Parser verarbeitet werden.
- Kalenderdaten sollten nach der Formatprüfung mit einer Datumsbibliothek validiert werden.
- E-Mail-Existenz lässt sich nicht durch Regex beweisen.
- Für umfangreiche Programmiersprachen oder verschachtelte Syntax ist ein Parser meist robuster.
15. Checkliste für ein zuverlässiges Regex-Muster
Hake die erledigten Punkte ab. Die Auswahl bleibt nur während dieses Seitenaufrufs erhalten.
0 von 10 Punkten erledigt
16. Häufige Fehler und Lösungen
Der Punkt findet zu viel
Ursache: . bedeutet „beliebiges Zeichen“ und nicht einen wörtlichen Punkt.
Lösung: Einen echten Punkt mit \. maskieren.
Nur der erste Treffer erscheint
Ursache: In JavaScript fehlt häufig das globale Flag g.
Lösung: Prüfen, ob wirklich alle Treffer benötigt werden, und gegebenenfalls g ergänzen.
Umlaute werden nicht erkannt
Ursache: [A-Za-z] und JavaScript-\w decken Umlaute nicht zuverlässig ab.
Lösung: Im Unicode-Modus beispielsweise \p{L} mit Flag u prüfen.
Muster funktioniert nur im Tester
Ursache: Tester und Zielanwendung verwenden unterschiedliche Regex-Varianten oder String-Escapes.
Lösung: Muster, Flags und Maskierung direkt in der Zielumgebung testen.
Lookbehind funktioniert nicht
Ursache: Lookbehind wird nicht von allen Regex-Varianten unterstützt (z.B. JavaScript vor ES2018).
Lösung: Prüfen, ob die Zielumgebung Lookbehind unterstützt; sonst alternative Konstruktion verwenden.
17. Übungen zum Mitmachen
Nutze für die Übungen den interaktiven Tester und beginne jeweils mit einem möglichst einfachen Muster.
Zahlen finden
Finde alle ganzen Zahlen im Text „Artikel 12 kostet 49 Euro, Artikel 7 kostet 8 Euro“.
Produktcode prüfen
Prüfe vollständig das Format: zwei Großbuchstaben, Bindestrich, vier Ziffern.
Namen extrahieren
Finde Wörter mit Unicode-Buchstaben aus „Murat, Göçmen, Köln, Python3“ und beobachte, wie Ziffern behandelt werden.
Datum gruppieren
Erstelle benannte Gruppen für Tag, Monat und Jahr und untersuche die Trefferdetails.
Hex-Farben finden
Finde alle Hex-Farbcodes im Text „#0f3460, rgb(15,52,96), #F5A623, #GGG“.
Lookaround anwenden
Finde alle Zahlen, denen ein Eurozeichen vorausgeht, im Text „Preis: 19,99 €, 49,99 €, 29 Euro“.
Lösungsvorschläge
Lösung zu Übung 1 anzeigen
\d+ mit dem Flag g findet jede zusammenhängende Ziffernfolge.
Lösung zu Übung 2 anzeigen
^[A-Z]{2}-\d{4}$ prüft die gesamte Eingabe auf das gewünschte Format.
Lösung zu Übung 3 anzeigen
\p{L}+ mit den Flags g und u findet zusammenhängende Unicode-Buchstaben. Bei „Python3“ entsteht dabei der Treffer „Python“.
Lösung zu Übung 4 anzeigen
^(?<tag>\d{2})\.(?<monat>\d{2})\.(?<jahr>\d{4})$ legt drei benannte Gruppen an.
Lösung zu Übung 5 anzeigen
#?[0-9a-f]{6}(?:[0-9a-f]{2})?\b mit gi findet Hex-Farbcodes.
Lösung zu Übung 6 anzeigen
(?<=€)\d+(?:,\d{2})? (Lookbehind) oder \b\d+(?:,\d{2})?\s*€\b (Alternative ohne Lookbehind).
18. Häufige Fragen zu regulären Ausdrücken
Was bedeutet „Regex“?
Regex ist die gebräuchliche Kurzform für „regular expression“, auf Deutsch „regulärer Ausdruck“. Gemeint ist ein Muster zur Verarbeitung von Text.
Warum funktionieren manche Muster in einem anderen Programm nicht?
Programme können unterschiedliche Regex-Varianten verwenden. Syntax, Flags, Unicode-Verhalten, Lookbehind und Ersetzungssyntax unterscheiden sich teilweise. Zusätzlich kann die String-Schreibweise einer Programmiersprache weitere Backslashes verlangen.
Kann Regex eine E-Mail-Adresse vollständig validieren?
Eine Regex kann die Form grob oder sehr detailliert prüfen. Ob das Postfach existiert und von der Person kontrolliert wird, lässt sich damit nicht beweisen. Dafür ist eine Bestätigungs-E-Mail erforderlich.
Was ist der Unterschied zwischen * und +?
* erlaubt null oder mehr Wiederholungen. + verlangt mindestens eine Wiederholung.
Wann brauche ich ^ und $?
Wenn die gesamte Eingabe dem Muster entsprechen soll, werden Anfang und Ende häufig mit diesen Ankern begrenzt. Für die Suche innerhalb eines längeren Textes sind sie meist nicht erforderlich.
Warum sind doppelte Backslashes nötig?
Wenn eine Regex als normaler String geschrieben wird, verarbeitet zuerst die Programmiersprache den Backslash und danach die Regex-Engine. In JavaScript wird deshalb aus dem Regex \d im String häufig "\\d". Regex-Literale und rohe Python-Strings reduzieren diese Doppelmaskierung.
Sind reguläre Ausdrücke immer die schnellste Lösung?
Nein. Einfache, präzise Muster sind oft effizient. Komplexe, mehrdeutige Verschachtelungen können jedoch langsam werden. Für strukturierte oder verschachtelte Formate ist ein Parser häufig verständlicher und robuster.
Wie lerne ich Regex am besten?
Baue Muster schrittweise auf, teste jede Ergänzung mit passenden und unpassenden Beispielen und erkläre jedes Zeichen in eigenen Worten. Ein kurzes verständliches Muster ist meist wertvoller als eine schwer wartbare Ein-Zeilen-Lösung.
Was ist der Unterschied zwischen Lookahead und Lookbehind?
Lookahead (?=...) prüft, ob nach der aktuellen Position ein bestimmtes Muster folgt. Lookbehind (?<=...) prüft, ob vor der aktuellen Position ein bestimmtes Muster steht.
Wann sollte ich Atomic Groups verwenden?
Atomic Groups (?>...) sind nützlich, wenn du Backtracking verhindern möchtest – zum Beispiel bei komplexen Mustern, bei denen die Regex-Engine sonst viele Alternativen durchprobiert. Das kann die Performance verbessern.
Hinweis: Teste reguläre Ausdrücke immer in der tatsächlichen Zielumgebung und mit realistischen Grenzfällen. Ein passendes Format ist nicht automatisch fachlich gültig.