JavaScript Intl.Segmenter: разбить строку на слова

Категория: JavaScript · Язык: JavaScript · Обновлено:

Intl.Segmenter разбивает Unicode-текст по словам, предложениям или графемам с учётом правил языка. Это надёжнее, чем считать символы по UTF-16 или делить строку только по пробелам: составные символы, эмодзи и слова разных письменностей могут занимать больше одной кодовой единицы. Пример собирает слова русского текста и отдельно считает графемы.

Получить слова и графемы

JavaScript
const text = "Кофе, чай и горячий шоколад.";

const words = [...new Intl.Segmenter("ru", {granularity: "word"}).segment(text)]
  .filter((part) => part.isWordLike)
  .map((part) => part.segment);

const graphemes = [...new Intl.Segmenter("ru", {granularity: "grapheme"})
  .segment("e\u0301👩‍💻")]
  .map((part) => part.segment);

console.log(words); // ["Кофе", "чай", "и", "горячий", "шоколад"]
console.log(graphemes.length); // 2

Для подсчёта слов фильтруйте по isWordLike, чтобы не включать пробелы и знаки пунктуации. Для пользовательского ограничения длины применяйте grapheme, а не string.length: последний считает кодовые единицы UTF-16. В старых браузерах и Node.js проверьте typeof Intl.Segmenter === "function" и предусмотрите fallback или полифилл.

Официальная спецификация: ECMAScript Internationalization API — Intl.Segmenter.