@Mo1she

Разделить строку на сегменты примерно по 50 символов?

Имеется длинная строка. Мне нужно разделить её на сегменты примерно по 50 символов длинной. Но чтобы слова, находящиеся на границе сегментов не разрывались, а помещались в какой-то один сегмент, это важно. Поэтому сегмент может иметь длинну 41, 45, 49 символов, неважно, главное чтобы не разрывались слова и количество символов в сегменте было примерно 50.

Я пробовал сделать так:
let str = 'some long string';
let result = str.match(/.{1,50}/g);


Этот код как вы понимаете делит строку на чёткие сегменты по 50 символов и разрывает отдельные слова на части. Как мне добиться желаемого?
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
e-vyushin
@e-vyushin
Frontend engineer
const str = 'Имеется длинная строка. Мне нужно разделить её на сегменты примерно по 50 символов длинной. Но чтобы слова, находящиеся на границе сегментов не разрывались, а помещались в какой-то один сегмент, это важно. Поэтому сегмент может иметь длинну 41, 45, 49 символов, неважно, главное чтобы не разрывались слова и количество символов в сегменте было примерно 50.';
str.match(/.{1,50}(\s|$)/mig)


Рассмотрим подробнее регулярное выражение:

. — находит любой символ. Под любым символом понимается действительно ЛЮБОЙ символ, на любом языке (латиница, кириллица и т. д.), в т. ч. (внимательно) пробелы и переносы строк.

{1,50} — количество повторений "любого символа". Указываем, что от 1 до 50 раз.

(\s|$) — любой пробельный символ или конец строки. Т. е. мы явно указываем, что на конце вхождения должен быть пробел или конец строки. Таким образом мы находим разделения слов. Стоит отметить, что \s также найдёт символ табуляции и переноса строки. Так что, если слова разделаются переносом строк или табом, то это тоже будет учитываться.

mig — без учёта регистра символов, глобальный поиск по всей строке, поддержка многострочных текстов.

Результатом данного примера является массив всех вхождений:

5b8c7c0dd9592795075447.jpeg

/*======== Поправка от 03.09.2017 20:30 ========*/

. — находит любой символ кроме перевода строки (\n \r \u2028 or \u2029)

В связи с этим, более актуальное решение будет выглядеть так:
const str = 'Имеется длинная строка. Мне нужно разделить её на сегменты примерно по 50 символов длинной. Но чтобы слова, находящиеся на границе сегментов не разрывались, а помещались в какой-то один сегмент, это важно. Поэтому сегмент может иметь длинну 41, 45, 49 символов, неважно, главное чтобы не разрывались слова и количество символов в сегменте было примерно 50.';
str.match(/(.\n*){1,49}(\s|$)/gi)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы