Signatur
Beschreibung
Eine Disjunktion ist in regulären Ausdrücken eine „Oder“-Verknüpfung. Die Muster links und rechts vom senkrechten Strich | sind gleichwertige Alternativen: /Katze|Hund/ findet entweder „Katze“ oder „Hund“. Man kann beliebig viele Alternativen aneinanderreihen, und jede Alternative darf selbst ein vollständiges Teilmuster mit Quantoren, Klassen, Gruppen und Ankern sein.
Unter allen Regex-Operatoren bindet | am schwächsten. Die Disjunktion teilt also den gesamten Ausdruck bzw. die gesamte umschließende Gruppe auf. /^ja|nein$/ bedeutet deshalb (^ja) oder (nein$) und nicht „genau ja oder nein“. Soll sich die Auswahl nur auf einen Teil beziehen, setzt man sie in eine Gruppe, am besten in eine nicht-erfassende: /^(?:ja|nein)$/.
Die Regex-Engine probiert die Alternativen von links nach rechts und nimmt die erste, mit der der Gesamtausdruck passt. Das ist nicht unbedingt die längste. Bei /Java|JavaScript/ gewinnt in „JavaScript“ deshalb „Java“. Längere oder spezifischere Alternativen gehören also nach vorn. Gibt es hinter der Gruppe noch weitere Musterteile, kann die Engine per Backtracking auf eine spätere Alternative zurückgreifen, wenn die erste nicht zum Rest passt.
Leere Alternativen sind erlaubt: /a|/ passt auf „a“ oder auf die leere Zeichenkette. Erfassende Gruppen in einer Alternative, die nicht benutzt wurde, stehen im Ergebnis als undefined.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $alternative1 … alternativeN Pflicht | Regex-Teilmuster | Beliebige Teilmuster, getrennt durch |. Jede Alternative darf leer sein und Zeichen, Zeichenklassen, Quantoren, Gruppen, Anker und Assertions enthalten. |
Rückgabewert
test(), exec(), match() oder replace() finden.Beispiele
Mehrere Wörter auf einmal finden
const tiere = /Katze|Hund|Maus/g;
const text = "Die Katze jagt die Maus, der Hund schläft.";
console.log(text.match(tiere));
console.log(text.replace(tiere, (t) => t.toUpperCase()));
Die Reihenfolge entscheidet: erste passende Alternative gewinnt
const s = "JavaScript";
console.log(s.match(/Java|JavaScript/)[0]);
console.log(s.match(/JavaScript|Java/)[0]);
// Mit Rest-Muster greift Backtracking auf die nächste Alternative zurück
console.log(s.match(/(?:Java|JavaScript)$/)[0]);
Fallstrick Vorrang: Anker und Gruppierung
const locker = /^ja|nein$/; // bedeutet: (^ja) ODER (nein$)
const streng = /^(?:ja|nein)$/; // bedeutet: genau "ja" oder "nein"
console.log(locker.test("jawohl")); // beginnt mit "ja"
console.log(locker.test("klar nein")); // endet mit "nein"
console.log(streng.test("jawohl"));
console.log(streng.test("nein"));
Alternation dynamisch aus einer Liste bauen (sicher escaped)
const sprachen = ["C", "C++", "C#", "Go"];
const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
// Längste zuerst, damit "C" nicht vor "C++" gewinnt
const muster = [...sprachen]
.sort((a, b) => b.length - a.length)
.map(escape)
.join("|");
const re = new RegExp(`(?:${muster})`, "g");
console.log("Ich mag C++, C# und Go.".match(re));
// Nicht benutzte Gruppen sind undefined
console.log("12em".match(/(\d+)px|(\d+)em/));
// Wichtig · Fallstricke
- Vorrang:
|bindet schwächer als alles andere./^a|b$/ist nicht dasselbe wie/^(?:a|b)$/. Bei Validierungen ist das eine häufige Fehlerquelle, weil Eingaben dann nur teilweise geprüft werden. - Kein „längster Treffer“: JavaScript nimmt die erste passende Alternative, nicht die längste. Überlappende Alternativen sollten deshalb nach absteigender Länge bzw. Spezifität sortiert sein.
- Einzelne Zeichen: Für einzelne Zeichen ist eine Zeichenklasse wie
[abc]meist lesbarer und schneller alsa|b|c. Innerhalb von[…]ist|ein ganz normales Zeichen und kein Oder. - Performance/ReDoS: Überlappende Alternativen unter Quantoren, etwa
/(a|a)*b/oder/(\w|\d)+$/, können exponentielles Backtracking auslösen. Bei Benutzereingaben ist das ein Sicherheitsrisiko (ReDoS). - Dynamische Muster: Benutzereingaben vor dem Einsetzen in
new RegExp()immer escapen, sonst können Zeichen wie|oder(das Muster verändern. - Ein wörtlicher senkrechter Strich wird als
\|geschrieben. - Doppelte benannte Gruppen in verschiedenen Alternativen, etwa
/(?<j>\d{4})-\d{2}|\d{2}\.(?<j>\d{4})/, sind erst ab ES2025 erlaubt (Chrome 125+, Firefox 129+, Safari 17+). Ältere Umgebungen melden dafür einenSyntaxError.