Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.06.2020, 23:12
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 156

Замена повторяющихся подстрок из подчеркиваний разной длины в строке.
Всем привет, у меня возникла проблема.

Есть задача, в одном предложении (строке), есть пропущенные слова, которые отображаются, как несколько подчеркиваний _______ . Их нужно заменить на одинаковый шорткод (к примеру на [shortcode]).

Для варианта с одним пропущенным словом я ищу последовательность пробел и два подчеркивания ' __' - это начало подстроки, и два подчеркивания и пробел '__ ' - это конец подстроки. И ее соответственно заменяю.

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

Спасибо

Последний раз редактировалось savsoft, 07.06.2020 в 23:19.
Ответить с цитированием
  #2 (permalink)  
Старый 07.06.2020, 23:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от savsoft
И ее соответственно заменяю
Её, это что из - начало подстроки, конец подстроки или то что между ними?
Ответить с цитированием
  #3 (permalink)  
Старый 07.06.2020, 23:43
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 156

Сообщение от laimas Посмотреть сообщение
Её, это что из - начало подстроки, конец подстроки или то что между ними?
Пока сделал так

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].
Ответить с цитированием
  #4 (permalink)  
Старый 08.06.2020, 00:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

То есть нужно просто заменить все подчеркивания? А зачем рассказ о начале, конце?

str = str.replace(/_+/g, () => '[space]')
Ответить с цитированием
  #5 (permalink)  
Старый 08.06.2020, 00:23
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 156

Сообщение от laimas Посмотреть сообщение
Её, это что из - начало подстроки, конец подстроки или то что между ними?
Сообщение от laimas Посмотреть сообщение
То есть нужно просто заменить все подчеркивания? А зачем рассказ о начале, конце?

str = str.replace(/_+/g, () => '[space]')
Я только начинаю разбираться с регулярными выражениями, поэтому делал все в лоб, искал начало подстроки, потом конец и заменял. Так конечно гораздо лучше.

Спасибо

А можно как-то таким способом сразу поставить перед и после [space] по пробелу, если их нет. Если [space] в самом начале предложения, то пробел в начале не ставить и если в конце, то не ставить пробел перед точкой (восклицательным знаком и вопросом).

И что посоветуете почитать/посмотреть по регулярным выражениям.

Еще раз спасибо.

Последний раз редактировалось savsoft, 08.06.2020 в 00:33.
Ответить с цитированием
  #6 (permalink)  
Старый 08.06.2020, 00:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от savsoft
А можно как-то таким способом сразу поставить перед и после [space] по пробелу, если их нет
А в конечном итоге это для чего? Если это будет на странице (html), то в ней лишние пробелы не отображаются, так что можно и без проверок заменять на ' [space] '. Или не желательно такое?

https://developer.mozilla.org/ru/doc...Objects/RegExp

А уроков по нему в сети полно.
Ответить с цитированием
  #7 (permalink)  
Старый 08.06.2020, 00:46
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 156

Сообщение от laimas Посмотреть сообщение
А в конечном итоге это для чего? Если это будет на странице (html), то в ней лишние пробелы не отображаются, так что можно и без проверок заменять на ' [space] '. Или не желательно такое?

https://developer.mozilla.org/ru/doc...Objects/RegExp

А уроков по нему в сети полно.
Есть много текстовых файлов с тестами для изучения английского. Теперь их переносят на сайт. Тексты проверяют и копируют целыми тестами. Иногда попадаются ошибки, а хотелось бы красивые предложения, чтобы не попадалось know[space]giving, а только know [space] giving
Ответить с цитированием
  #8 (permalink)  
Старый 08.06.2020, 01:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Можно захватывать с краев любое количество пробелов (если они будут), а в конце еще и символы ".,?!", то есть знаки препинания любые возможные, а в функции проверять если ли такие в найденном, если есть, значит возвращать этот знак, иначе пробел. А вначале ставить пробел если это не первое найденное (по позиции).

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)


Можно добавить любые символы, можно убрать ненужные, я не знаю, что в этих текстах можно ожидать.
Ответить с цитированием
  #9 (permalink)  
Старый 08.06.2020, 01:36
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Можно поступить и иначе - разбить строку на массив по шаблону _+, соединив затем его в строку через " [space] ", а с краев строки соответственно добавить с пробелом только в конце и только в начале. Элементы массива перед соединением обойти функцией map, удалив в них крайние пробелы (либо сразу разбивать с учетом пробелов и исключить map).

Последний раз редактировалось laimas, 08.06.2020 в 01:38.
Ответить с цитированием
  #10 (permalink)  
Старый 08.06.2020, 10:41
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 156

Сообщение от laimas Посмотреть сообщение
Можно поступить и иначе - разбить строку на массив по шаблону _+, соединив затем его в строку через " [space] ", а с краев строки соответственно добавить с пробелом только в конце и только в начале. Элементы массива перед соединением обойти функцией map, удалив в них крайние пробелы (либо сразу разбивать с учетом пробелов и исключить map).
Спасибо, буду разбираться.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена в регулярном выражении подстрок Rust Общие вопросы Javascript 29 27.05.2019 09:48
Замена в строке с регулярным выражением Tipylja Общие вопросы Javascript 4 14.08.2018 11:25
Замена слова в строке на определенной позиции Hapson Общие вопросы Javascript 3 18.01.2014 05:17
Замена подстрок в строке Neznayka Javascript под браузер 8 01.06.2013 23:44
Регулярное, замена в строке mico Общие вопросы Javascript 1 13.09.2011 22:13