Замена повторяющихся подстрок из подчеркиваний разной длины в строке.
Всем привет, у меня возникла проблема.
Есть задача, в одном предложении (строке), есть пропущенные слова, которые отображаются, как несколько подчеркиваний _______ . Их нужно заменить на одинаковый шорткод (к примеру на [shortcode]). Для варианта с одним пропущенным словом я ищу последовательность пробел и два подчеркивания ' __' - это начало подстроки, и два подчеркивания и пробел '__ ' - это конец подстроки. И ее соответственно заменяю. Но теперь пропущенных слов может быть несколько, подстроки из подчеркиваний могут быть разной длины, да и после подчеркиваний может не быть пробела, если это конец предложения. Просто копировать строку по одному символу и проверять на подчеркивание? Или есть какой более умный способ? Спасибо |
Цитата:
|
Цитата:
var str = '____ you wanted to know ___________________ giving a good advice and getting him to return the ___.'; var start = -1; var newstr = ''; for (let i = 0; i < str.length; i++) { if (str[i] == '_' && start == -1) { start = i; } if (str[i] != '_' && start == -1) { newstr = newstr + str[i]; } if (str[i] != '_' && start != -1) { newstr = newstr + '[space]' + str[i]; start = -1; } } Получаю [space] you wanted to know [space] giving a good advice and getting him to return the [space]. |
То есть нужно просто заменить все подчеркивания? А зачем рассказ о начале, конце?
str = str.replace(/_+/g, () => '[space]') |
Цитата:
Цитата:
Спасибо А можно как-то таким способом сразу поставить перед и после [space] по пробелу, если их нет. Если [space] в самом начале предложения, то пробел в начале не ставить и если в конце, то не ставить пробел перед точкой (восклицательным знаком и вопросом). И что посоветуете почитать/посмотреть по регулярным выражениям. Еще раз спасибо. |
Цитата:
https://developer.mozilla.org/ru/doc...Objects/RegExp А уроков по нему в сети полно. |
Цитата:
|
Можно захватывать с краев любое количество пробелов (если они будут), а в конце еще и символы ".,?!", то есть знаки препинания любые возможные, а в функции проверять если ли такие в найденном, если есть, значит возвращать этот знак, иначе пробел. А вначале ставить пробел если это не первое найденное (по позиции).
var str = '____ you wanted to know,___________________ giving a good advice______, and getting him to return the ___.'; str = str.replace(/\s*_+\s*[\.\?!,]?/g, (v, i) => (i ? ' ' : '') + '[space]' + ((v = v.match(/[\.\?!,]{1}/)) ? v : ' ')) console.log(str) Можно добавить любые символы, можно убрать ненужные, я не знаю, что в этих текстах можно ожидать. |
Можно поступить и иначе - разбить строку на массив по шаблону _+, соединив затем его в строку через " [space] ", а с краев строки соответственно добавить с пробелом только в конце и только в начале. Элементы массива перед соединением обойти функцией map, удалив в них крайние пробелы (либо сразу разбивать с учетом пробелов и исключить map).
|
Цитата:
|
Часовой пояс GMT +3, время: 07:05. |