JavaScript Regex
JavaScript reguläre Ausdrücke (Regex): Muster erstellen, Flags, String- und RegExp-Methoden sowie Grundlagen für Suche und Textvalidierung.
Einführung in reguläre Ausdrücke (Regex) in JavaScript
Reguläre Ausdrücke, allgemein bekannt als Regex, sind Zeichenfolgen, die Suchmuster bilden. Sie sind in der Programmierung unverzichtbare Werkzeuge für Textverarbeitungsaufgaben wie das Suchen, Bearbeiten und Manipulieren von string-Daten. Regex wird in verschiedenen Bereichen eingesetzt, etwa bei der Datenvalidierung, beim Parsen, bei der Syntaxhervorhebung und vielem mehr.
Zum Beispiel lässt sich schnell prüfen, ob eine Zeichenkette wie eine E-Mail-Adresse aussieht:
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test("[email protected]")); // true
console.log(emailRegex.test("not-an-email")); // falseHinweis: Dies ist ein vereinfachtes Muster. Für die Validierung in der Produktion sollten strengere Regeln oder spezialisierte Bibliotheken in Betracht gezogen werden.
Einsatzbereiche von Regex:
- Webentwicklung: Validierung von Formulareingaben, Parsen von URLs und Suche innerhalb von Inhalten.
- Datenanalyse: Extraktion bestimmter Muster aus großen Datensätzen.
- Textbearbeitung: Suchen und Ersetzen von Text in Dokumenten oder Codebasen.
- Programmiersprachen: Die meisten modernen Sprachen, einschließlich JavaScript, unterstützen Regex.
Einen regulären Ausdruck erstellen
JavaScript bietet zwei Möglichkeiten, einen Regex zu erstellen, und der Unterschied ist in der Praxis relevant.
// 1. Literal syntax — compiled once when the script loads.
const re1 = /\d+/g;
// 2. Constructor — useful when the pattern is built from a variable.
const word = "cat";
const re2 = new RegExp(word + "s?", "i"); // matches "cat" or "cats", case-insensitive
console.log(re1 instanceof RegExp); // true
console.log(re2.source, re2.flags); // cats? iVerwende die Literal-Form für feste Muster — sie ist kürzer und die Engine kompiliert sie im Voraus. Greife auf den RegExp-Konstruktor zurück, wenn das Muster dynamisch ist (zum Beispiel aus Benutzereingaben aufgebaut). Beachte, dass in einem string der Backslash verdoppelt werden muss: "\\d" im Konstruktor entspricht \d in einem Literal.
Wie Regex mit Strings zusammenarbeitet: die wichtigsten Methoden
Ein Muster ist nur zusammen mit einer Methode nützlich, die es ausführt. Das sind die, die du täglich verwenden wirst.
const text = "The year 2023 follows 2022.";
// test() → boolean: "does it match anywhere?"
console.log(/\d{4}/.test(text)); // true
// String.match() with /g → array of all matches
console.log(text.match(/\d{4}/g)); // [ '2023', '2022' ]
// String.replace() → returns a new string
console.log(text.replace(/\d{4}/g, "YEAR")); // The year YEAR follows YEAR.
// RegExp.exec() → one match at a time, with capture groups
console.log(/(\d{4})/.exec(text)[1]); // 2023
// String.matchAll() → iterator of full match objects (needs /g)
for (const m of text.matchAll(/(\d{4})/g)) {
console.log(m[0], "at index", m.index);
}
// 2023 at index 9
// 2022 at index 22Wähle die Methode nach Zweck: test() für eine Ja/Nein-Prüfung, match()/matchAll() zum Extrahieren von Daten und replace() zum Umschreiben von Text. Das Flag g (global) verwandelt „die erste Übereinstimmung" in „alle Übereinstimmungen" und ist daher für match, matchAll und Alle-ersetzen-Operationen unverzichtbar.
Ein Muster lesen: häufige Bausteine
Die meisten Muster werden aus einem kleinen Vokabular zusammengesetzt. Hier ein funktionierendes Beispiel, das mehrere Elemente gleichzeitig verwendet:
const log = "2023-06-19 ERROR user=42 path=/login";
// \d digit \w word char \s whitespace
// . any char + 1 or more [] a set of chars
const match = log.match(/(\d{4}-\d{2}-\d{2})\s+(\w+)\s+user=(\d+)/);
console.log(match[1]); // 2023-06-19 (the date group)
console.log(match[2]); // ERROR (the level group)
console.log(match[3]); // 42 (the user id group)Jedes (...) ist eine Erfassungsgruppe, deren Text im Ergebnis-array erscheint. \d, \w und \s sind Zeichenklassen; die Quantifizierer + und {4} geben an, wie oft das vorherige Token wiederholt werden soll. Kombiniere diese Elemente, und du kannst strukturierte Daten aus einfachem Text extrahieren.
Kurzübersicht: Flags und Quantifizierer
| Kategorie | Symbol/Flag | Beschreibung |
|---|---|---|
| Flags | i | Groß-/Kleinschreibung ignorieren |
g | Globale Suche (alle Übereinstimmungen finden) | |
m | Mehrzeiliger Modus (^ und $ passen zu Zeilengrenzen) | |
s | Dotall-Modus (. passt auch zu Zeilenumbrüchen). Erfordert ES2018+. | |
u | Unicode-Modus | |
y | Sticky-Modus (passt nur ab lastIndex) | |
| Quantifizierer | * | 0 oder mehr Male |
+ | 1 oder mehr Male | |
? | 0 oder 1 Mal | |
{n} | Genau n Male | |
{n,} | n oder mehr Male | |
{n,m} | Zwischen n und m Male |
Häufige Fallstricke
Einige Überraschungen stolpern fast alle, die Regex in JavaScript lernen:
-
Ein
/g-Regex merkt sich, wo er aufgehört hat. Wenn du dasselbeRegExp-Objekt mittest()oderexec()wiederverwendest, erhöht eslastIndexzwischen den Aufrufen. Dadurch kann der zweitetest()bei einer eindeutig passenden Zeichenkettefalsezurückgeben. Verwende jedes Mal ein frisches Literal oder setzere.lastIndex = 0zurück.const re = /a/g; const s = "a"; console.log(re.test(s)); // true console.log(re.test(s)); // false — lastIndex moved past the end -
Dynamische Muster müssen Benutzereingaben escapen. Wenn du einen Regex aus Text aufbaust, den der Benutzer eingegeben hat, werden Zeichen wie
.oder(als Sonderzeichen behandelt. Escape sie zuerst:const escape = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const userInput = "a.b"; const re = new RegExp(escape(userInput)); console.log(re.test("axb")); // false — the dot is now literal console.log(re.test("a.b")); // true -
Standardmäßig gierig.
.+erfasst so viel wie möglich; füge?hinzu, um es lazy zu machen (.+?). Siehe Gierige und lazy Quantifizierer.
Lernfahrplan
Diese Seite ist der Einstieg in den Regex-Teil des Kurses. Arbeite die folgenden Kapitel der Reihe nach durch, um ein vollständiges, praxisnahes Verständnis zu erlangen:
- Muster und Flags — Muster aufbauen und wie die Flags (
i,g,m,s,u,y) die Suche verändern. - Zeichenklassen —
\d,\w,\sund ihre Negationen. - Unicode: Flag
uund Klasse\p{...}— mehrsprachigen Text und Emoji verarbeiten. - Anker: Stringanfang
^und -ende$— an Grenzen treffen. - Mehrzeiliger Modus der Anker, Flag
m—^und$jede Zeile treffen lassen. - Wortgrenze
\b— ganze Wörter treffen. - Sonderzeichen escapen —
.,(,?wörtlich verwenden. - Mengen und Bereiche
[...]— benutzerdefinierte Zeichensätze. - Quantifizierer
+,*,?,{n}— Wiederholungen festlegen. - Gierige und lazy Quantifizierer — steuern, wie viel gematcht wird.
- Erfassungsgruppen — Teile eines Treffers extrahieren und benennen.
- Rückverweise
\nund\k<name>— erfassten Text wiederverwenden. - Alternation (ODER)
|— eine von mehreren Optionen treffen. - Lookahead und Lookbehind — Nullbreite-Assertionen.
- Katastrophales Backtracking — pathologische Performance diagnostizieren und vermeiden.
- Sticky-Flag
y, Suche an Position — verankertes, positionsbasiertes Matching.
Die Methoden, die diese Muster ausführen, findest du im Kapitel über das RegExp-Objekt und seine Methoden sowie im Kapitel über JavaScript strings.
Am Ende dieser Lektionen wirst du in der Lage sein, effektive Regex-Muster zum Suchen, Validieren und Transformieren von Text in JavaScript zu erstellen.