Start · Sprachen · JavaScript · Referenz · Disjunction: |

Disjunction: |

Keyword

Der senkrechte Strich <code>|</code> trennt in regulären Ausdrücken mehrere Alternativen. Der Ausdruck passt, wenn eine der Alternativen passt.

seit JavaScript ES3 (Baseline: alle Browser) Kategorie: syntax

Signatur

/alternative1|alternative2|…|alternativeN/

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

Typ
—
Beschreibung
Die Disjunktion ist Syntax und kein Funktionsaufruf, sie hat also keinen eigenen Rückgabewert. Sie legt fest, welche Zeichenfolge Methoden wie 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()));
[ 'Katze', 'Maus', 'Hund' ] Die KATZE jagt die MAUS, der HUND schläft.

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]);
Java JavaScript JavaScript

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"));
true true false true

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/));
[ 'C++', 'C#', 'Go' ] [ '12em', undefined, '12', index: 0, input: '12em', groups: undefined ]

// 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 als a|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 einen SyntaxError.