const str = 'Имеется длинная строка. Мне нужно разделить её на сегменты примерно по 50 символов длинной. Но чтобы слова, находящиеся на границе сегментов не разрывались, а помещались в какой-то один сегмент, это важно. Поэтому сегмент может иметь длинну 41, 45, 49 символов, неважно, главное чтобы не разрывались слова и количество символов в сегменте было примерно 50.';
str.match(/.{1,50}(\s|$)/mig)
Рассмотрим подробнее регулярное выражение:
. — находит любой символ. Под любым символом понимается действительно ЛЮБОЙ символ, на любом языке (латиница, кириллица и т. д.), в т. ч. (внимательно) пробелы и переносы строк.
{1,50} — количество повторений "любого символа". Указываем, что от 1 до 50 раз.
(\s|$) — любой пробельный символ или конец строки. Т. е. мы явно указываем, что на конце вхождения должен быть пробел или конец строки. Таким образом мы находим разделения слов. Стоит отметить, что \s также найдёт символ табуляции и переноса строки. Так что, если слова разделаются переносом строк или табом, то это тоже будет учитываться.
mig — без учёта регистра символов, глобальный поиск по всей строке, поддержка многострочных текстов.
Результатом данного примера является массив всех вхождений:
/*======== Поправка от 03.09.2017 20:30 ========*/
. — находит любой символ кроме перевода строки (\n \r \u2028 or \u2029)
В связи с этим, более актуальное решение будет выглядеть так:
const str = 'Имеется длинная строка. Мне нужно разделить её на сегменты примерно по 50 символов длинной. Но чтобы слова, находящиеся на границе сегментов не разрывались, а помещались в какой-то один сегмент, это важно. Поэтому сегмент может иметь длинну 41, 45, 49 символов, неважно, главное чтобы не разрывались слова и количество символов в сегменте было примерно 50.';
str.match(/(.\n*){1,49}(\s|$)/gi)