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