Signatur
Beschreibung
Eine Wortgrenzen-Assertion ist ein Muster ohne eigene Breite. Sie verbraucht also keine Zeichen, sondern prüft nur eine Bedingung an der aktuellen Position im String. \b trifft zu, wenn genau eines der beiden angrenzenden Zeichen ein Wortzeichen ist. Wortzeichen sind die Zeichen, auf die auch \w passt: [A-Za-z0-9_]. Auch Anfang und Ende des Strings zählen als Nicht-Wortzeichen. \B ist das Gegenteil: Es trifft zu, wenn beide Nachbarn Wortzeichen sind oder beide keine sind.
Typische Einsatzfälle sind die Suche nach ganzen Wörtern (/\bcat\b/ findet „cat“, aber nicht das „cat“ in „concatenate“), das Finden von Bezeichnern im Quelltext und das Einfügen von Zeichen innerhalb von Wörtern oder Zahlen mit \B, zum Beispiel Tausendertrennzeichen.
Wichtig: Die Definition von „Wort“ ist rein ASCII-basiert. Umlaute, ß, akzentuierte Buchstaben oder kyrillische Zeichen gelten nicht als Wortzeichen. Das gilt auch mit dem Flag u. Für deutsche oder mehrsprachige Texte eignen sich Lookarounds mit Unicode-Eigenschaften besser, etwa (?<![\p{L}\p{N}_]) und (?![\p{L}\p{N}_]).
Rückgabewert
\b besteht, ist ein leerer String.Beispiele
Nur ganze Wörter ersetzen
const text = "cat concatenate cat. Bobcat";
// Ohne \b würde auch „concatenate“ und „Bobcat“ verändert
const result = text.replace(/\bcat\b/g, "Katze");
console.log(result);
Tausendertrennzeichen mit \B einfügen
const formatThousands = (n) =>
String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ".");
console.log(formatThousands(1234567));
console.log(formatThousands(999));
Fallstrick: Umlaute sind keine Wortzeichen
const wort = "Grüße aus München";
// ASCII-basierte Wortgrenzen zerlegen Wörter mit Umlauten
console.log(wort.match(/\b\w+\b/g));
// Unicode-taugliche Alternative mit Lookarounds
const unicodeWords = /(?<![\p{L}\p{N}_])[\p{L}\p{N}_]+(?![\p{L}\p{N}_])/gu;
console.log(wort.match(unicodeWords));
Dynamischer Wortfilter mit new RegExp
const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const containsWord = (text, word) =>
new RegExp(`\\b${escapeRegExp(word)}\\b`, "i").test(text);
console.log(containsWord("Error: file not found", "error"));
console.log(containsWord("Errors happened", "error"));
// Wichtig · Fallstricke
- Escaping im String: Mit
new RegExp("\b")entsteht ein Backspace-Zeichen (U+0008), keine Wortgrenze. Im String-Literal muss es"\\b"heißen. - In Zeichenklassen bedeutet
[\b]das Backspace-Zeichen, keine Wortgrenze.[\B]ist mit dem Flaguodervein Syntaxfehler. - Nur ASCII:
ä,ö,ü,ß,éusw. gelten nicht als Wortzeichen. So passt/\bMüller\b/auch auf „Müllerin“ nicht wie erwartet: Das Muster greift trotzdem, weil zwischenMundüselbst eine Grenze liegt. Verwende Lookarounds mit\p{L}und dem Flagu. - Kombination
i+u: Durch die Unicode-Groß-/Kleinschreibungs-Faltung gelten dann auchſ(U+017F) und das Kelvin-ZeichenK(U+212A) als Wortzeichen. Das beeinflusst\w,\bund\B. - Leerer String:
/\b/.test("")ergibtfalse,/\B/.test("")ergibttrue. - Wortgrenzen hängen nur von den direkten Nachbarzeichen ab. Satzzeichen wie
-oder'erzeugen Grenzen, darum findet/\bstate\b/das Wort auch in „read-only-state“.