Signatur
Beschreibung
Der Konstruktor Intl.Segmenter() erstellt einen Segmentierer, der Zeichenketten nach den Unicode-Regeln (UAX #29) und den Konventionen einer bestimmten Sprache in sinnvolle Einheiten zerlegt. Die eigentliche Zerlegung erfolgt über die Methode segment(), die ein iterierbares Segments-Objekt liefert.
Einsatzgebiete sind vor allem Fälle, in denen string.length, split('') oder reguläre Ausdrücke versagen: das korrekte Zählen von Zeichen bei Emojis und kombinierten Akzenten (granularity: "grapheme"), das Zählen und Extrahieren von Wörtern in Sprachen ohne Leerzeichen wie Japanisch, Chinesisch oder Thai ("word") sowie die Satzerkennung, etwa für Textvorschauen ("sentence").
Den Konstruktor muss man mit new aufrufen, sonst wird ein TypeError geworfen. Da das Anlegen vergleichsweise viel kostet, sollte man eine Instanz einmal erzeugen und dann für viele Texte wiederverwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locales | string | string[] | Intl.Locale | undefined | Standard-Locale der Laufzeitumgebung | BCP-47-Sprachkennung (z. B. "de", "ja-JP") oder ein Array davon. Die Sprache beeinflusst vor allem die Wort- und Satztrennung. |
| $options | object | {} | Konfigurationsobjekt mit folgenden Eigenschaften:
|
Rückgabewert
Intl.Segmenter-Instanz mit den Methoden segment() und resolvedOptions().Beispiele
Sichtbare Zeichen korrekt zählen (Emojis)
const text = 'Hi 👋🏽 Familie: 👨👩👧';
const segmenter = new Intl.Segmenter('de', { granularity: 'grapheme' });
const anzahl = [...segmenter.segment(text)].length;
console.log(text.length); // UTF-16-Codeeinheiten
console.log(anzahl); // wahrgenommene Zeichen
Wörter zählen, ohne Satzzeichen mitzuzählen
const wortSegmenter = new Intl.Segmenter('de', { granularity: 'word' });
const zaehleWoerter = (text) =>
[...wortSegmenter.segment(text)].filter((s) => s.isWordLike).length;
console.log(zaehleWoerter('Hallo Welt! Wie geht es dir?'));
Japanischen Text in Wörter zerlegen
const ja = new Intl.Segmenter('ja-JP', { granularity: 'word' });
const woerter = [...ja.segment('吾輩は猫である。')]
.filter((s) => s.isWordLike)
.map((s) => s.segment);
console.log(woerter);
Ersten Satz als Vorschau extrahieren
const saetze = new Intl.Segmenter('de', { granularity: 'sentence' });
const vorschau = (text) => {
const [erster] = saetze.segment(text);
return erster ? erster.segment.trim() : '';
};
console.log(vorschau('Dr. Müller kommt heute. Bitte pünktlich sein!'));
console.log(saetze.resolvedOptions());
// Wichtig · Fallstricke
- Aufruf nur mit
new: Ohnenewwird einTypeErrorgeworfen. Ein ungültigergranularity-Wert löst einenRangeErroraus. - Browser-Unterstützung: Chrome/Edge 87+, Safari 14.1+ und Node.js 16+ unterstützen den Konstruktor. Firefox erst ab Version 125 (2024). Für ältere Umgebungen vorher mit
'Segmenter' in Intlprüfen oder ein Polyfill einsetzen (z. B. von FormatJS). - Ergebnisse unterscheiden sich je nach Engine: Wort- und Satzgrenzen hängen von den ICU-Daten der jeweiligen Engine ab, besonders bei CJK-Sprachen und Abkürzungen wie „Dr.“. Tests sollten sich deshalb nicht auf die exakte Aufteilung verlassen.
- Performance: Instanzen wiederverwenden statt pro Aufruf neu erzeugen.
segment()arbeitet verzögert: Mitfor...ofodercontaining(index)muss man nicht den ganzen Text auf einmal zerlegen. - Bei
granularity: "word"zählen auch Leerzeichen und Satzzeichen als Segmente. Echte Wörter findet man überisWordLike.