Как в регулярном выражении расставить пробелы после знаков пунктуации?
Есть текст, например:
Слово, слово ,слово, слово , слово,слово,слово , , , , ,,,слово ;
слово; слово, , , слово,слово ;
Нужно c помощью регулярного выражения и замены получить текст:
Слово, слово, слово, слово, слово, слово, слово, , , , , , , слово;
слово; слово, , , слово, слово;
Т.е. до знака пунктуации не должно быть пробела, а после знака пунктуации должен быть ровно один пробел. Лишние пробелы в конце строки должны удаляться. Строки ,,,,
должны преобразовываться в , , , ,
Я составил регулярное выражение в Notepad++:
(?|(?<![,; ]) +([,;]) *|([,;]) {2,}(?=[^ \n\r])|([,;])(?=[^ \n\r]))| +$
Строка замены:
(?1$1 :)
Можно ли сделать как-то изящнее и правильнее?
Ответы (3 шт):
Нужно c помощью регулярного выражения и замены получить текст
Предложу такой вариант...
const s = `Слово, слово ,слово, слово , слово,слово,слово , , , , ,,,слово ;
слово; слово, , , слово,слово ;`
const r = / *(,|;) */g
console.log(s.replace(r, '$1 '))
На тестовом примере на Notepad++ отрабатывает такой паттерн:
Поиск (начинается с пробела и содержит пробелы, а не пробельные символы \s
, чтобы не реагировать, например, на перевод строки. \Z
используется вместо $
, чтобы не реагировать на переводы строки внутри текста):
*([;,]?) *(?=\Z)| *([;,]) *(?!\Z)
Замена на
(?1$1:$2 )
Благодарю всех за помощь. Сделал по такому алгоритму:
Убираем один и более лишних пробелов. Замена на пустоту. После применения шаблона после слова не остаётся вообще ничего, а после
,
или;
остаётся один пробел, если там изначально было более одного пробела.(?<![,;]) +
Ищем
,
или;
, после которых следуют ноль, два, или более пробела. Замена на$1
. Причем,
и;
, которые стоят в конце строки, не затрагиваются, потому что после них пробелы не нужны. Это обеспечивается выражением(?=\S)
.([,;])( {0}| {2,})(?=\S)
Убираем замыкающие строку пробелы. Замена на пустоту.
+$
Объединим эти три шаблона в один шаблон с помощью |
:
(?<![,;]) +|([,;])( {0}| {2,})(?=\S)| +$
Замена на строку:
${1:+$1 }
(для сайта regex101.com
нужно выбрать flavor PCRE2
).
(?1$1 )
(для Notepad++
).
Строка замены $1
не отрабатывает правильно.
В итоге для тестовой строки получаем:
Слово, слово, слово, слово, слово, слово, слово, , , , , , , слово;
слово; слово, , , слово, слово;
В конце строк пробелы удаляются. Для Notepad++
кнопка "Найти Далее" ищет только "неправильные" вхождения.
Не смог найти инструкцию по строкам замены, например, ${1:+$1 }
. Буду благодарен, если кинете ссылку на описание.