Intl.Segmenter în JavaScript

Formatare regională (Intl) Browserele moderne, Node.js 16+

Împarte corect un text în caractere vizibile, cuvinte sau propoziții, inclusiv pentru emoji.

Sintaxă
const s = new Intl.Segmenter("ro", { granularity: "word" });
for (const { segment } of s.segment(text)) { ... }

Ce face Intl.Segmenter

segment(text) returnează o colecție parcurgibilă de bucăți. Cu granularity: "grapheme" (implicit) bucățile sunt caracterele așa cum le vede omul: un emoji compus (👨‍👩‍👧) sau o literă cu semn este o singură bucată, deși ocupă mai multe poziții în length.

Cu "word", fiecare bucată are isWordLike, care deosebește cuvintele de spații și punctuație. Cu "sentence" textul este împărțit în propoziții. Funcționează și pentru limbi fără spații între cuvinte (japoneză, thailandeză).

Parametri

Parametru Descriere
limba Opțional. Codul limbii.
optiuni Opțional. granularity: "grapheme", "word" sau "sentence".

Ce returnează

Un obiect segmentator.

Exemple

Exemplul 1: Caractere vizibile față de length

const text = "Familie: 👨‍👩‍👧";
const caractere = [...new Intl.Segmenter("ro").segment(text)].map((s) => s.segment);

console.log(text.length, [...text].length, caractere.length);
console.log(caractere.at(-1));

Rezultat

17 14 10
👨‍👩‍👧

Exemplul 2: Numărarea cuvintelor și împărțirea în propoziții

const text = "Bună ziua! Ce mai faci, Ana? Eu sunt bine.";

const cuvinte = new Intl.Segmenter("ro", { granularity: "word" });
console.log([...cuvinte.segment(text)].filter((s) => s.isWordLike).length);

const propozitii = new Intl.Segmenter("ro", { granularity: "sentence" });
console.log([...propozitii.segment(text)].map((s) => s.segment.trim()));
console.log(cuvinte.resolvedOptions().granularity, Intl.Segmenter.supportedLocalesOf("ro"));

Rezultat

9
[ 'Bună ziua!', 'Ce mai faci, Ana?', 'Eu sunt bine.' ]
word [ 'ro' ]

Greșeli frecvente

  • Numeri cuvintele cu text.split(" "). Spațiile duble și punctuația dau numere greșite; folosește granularity: "word" cu isWordLike.

Comenzi înrudite

  • split: Împarte un text în bucăți după un separator și returnează un tablou.
  • length: Numărul de caractere dintr-un șir sau numărul de elemente dintr-un tablou.
  • String.prototype.isWellFormed / toWellFormed: Verifică dacă un text are perechi surogat rupte și le înlocuiește cu caracterul �.