Signatur
Beschreibung
Eine Lookbehind Assertion „blickt zurück“: Sie prüft, ob der Text links von der aktuellen Position im regulären Ausdruck zum angegebenen Muster passt. Dabei wird kein Zeichen verbraucht. Ist die Prüfung erfolgreich, bleibt die Position unverändert und der Abgleich geht weiter. Der geprüfte Text wird deshalb nicht Teil des Treffers.
(?<=muster): positiver Lookbehind. Er passt nur, wenn direkt davormustersteht.(?<!muster): negativer Lookbehind. Er passt nur, wenn direkt davormusternicht steht.
Typische Anwendungen: einen Wert hinter einem Präfix herausziehen, ohne das Präfix mitzunehmen (z. B. den Betrag hinter € oder $). Außerdem Treffer ausschließen, die in einem bestimmten Zusammenhang stehen, etwa Zahlen, vor denen kein Minuszeichen steht. Auch beim Ersetzen mit String.prototype.replace() ist das praktisch, weil der Kontext nicht in der Ersetzung wiederholt werden muss.
In JavaScript darf ein Lookbehind beliebig lange und variable Muster enthalten, also auch Quantoren wie *, + oder {n,m}. Viele andere Regex-Engines erlauben das nicht. Intern wird das Muster im Lookbehind von rechts nach links abgeglichen. Das wirkt sich auf die Reihenfolge der Gruppen und auf gierige Quantoren aus (siehe Hinweise).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $muster Pflicht | RegExp-Teilausdruck | Beliebiges Regex-Muster, das direkt vor der aktuellen Position stehen muss (?<=) bzw. nicht stehen darf (?<!). Gruppen, Quantoren, Alternativen und Rückverweise sind erlaubt. |
Rückgabewert
Beispiele
Beträge hinter einem Währungszeichen herausziehen
const text = 'Preis: €49,90, Versand: €4,95, Rabatt: 10%';
// Nur Zahlen, vor denen ein € steht – das € gehört nicht zum Treffer
const betraege = text.match(/(?<=€)\d+(?:,\d{2})?/g);
console.log(betraege);
Negativer Lookbehind: nur positive Zahlen finden
const werte = 'Temperaturen: 12, -3, 7, -15, 20';
// Weder ein Minus noch eine Ziffer darf direkt davor stehen
// (sonst würde bei -15 die 5 passen)
const positiv = werte.match(/(?<![-\d])\d+/g).map(Number);
console.log(positiv);
Ersetzen mit Kontext: Tausendertrennzeichen einfügen
const formatiere = (zahl) =>
String(zahl).replace(/(?<=\d)(?=(\d{3})+$)/g, '.');
console.log(formatiere(1234567));
console.log(formatiere(999));
Lookbehind mit variabler Länge und benannter Gruppe
const log = 'user=anna id=42 user=bernd id=7';
// Beliebig viele Leerzeichen hinter 'id=' sind erlaubt
const ids = [...log.matchAll(/(?<=id=\s*)(?<id>\d+)/g)]
.map((m) => Number(m.groups.id));
console.log(ids);
// Schlüssel-Präfix im Treffer vermeiden
console.log('user=anna'.match(/(?<=user=)\w+/)[0]);
// Wichtig · Fallstricke
- Kompatibilität: Lookbehind ist seit ES2018 Teil des Standards. Unterstützt wird er von Chrome 62+, Firefox 78+, Node.js 8.10+/10+ und Safari erst ab 16.4 (2023). In älteren Umgebungen ist schon das Parsen des Literals ein
SyntaxError, und das bricht das ganze Skript ab. Wer ältere Browser unterstützen muss, erstellt den Ausdruck mitnew RegExp()in einemtry/catchoder verzichtet auf Lookbehind. - Abgleich von rechts nach links: Innerhalb des Lookbehinds werden gierige Quantoren von rechts aus ausgewertet.
/(?<=(\d+)(\d+))$/.exec('1053')liefert die Gruppen'1'und'053', nicht'105'und'3'. Ein Rückverweis muss links von der Gruppe stehen, auf die er sich bezieht:/(?<=\1(a))/. - Kein Zeichenverbrauch: Ein Lookbehind allein passt auf eine leere Zeichenkette. Mit dem Flag
gundreplacekönnen deshalb Treffer an Positionen entstehen, mit denen man nicht rechnet. - Gruppen in einem negativen Lookbehind werden nie gefüllt, sie sind im Ergebnis immer
undefined. - Lookbehinds sind Assertions und lassen sich nicht mit Quantoren versehen:
(?<=a)*ist einSyntaxError. - Leistung: Muster mit variabler Länge im Lookbehind können bei langen Texten teuer werden. Ein Anker oder ein festes Präfix hilft.