Удалить однотипные элементы в заданном диапазоне

  • Автор темы Автор темы Serbel
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Serbel

Топикстартер
10 лет на форуме
Сообщения
393
Реакции
90
Добрый день. Имеется большой объём текста, поделённого на «области». Каждая область начинается с однотипного заголовка, скажем:
НАЧАЛО. Собственно текст этого начала. Только в нём есть¶
ненужные переносы строк прямо ¶
посреди предложений.¶
КОНЕЦ. Дальше всё в порядке.¶
Возможно ли регулярными выражениями в один шаг заменить по всему тексту переносы строк между словами «Начало» и «Конец» на пробелы? Количество строк в каждом случае разное.

Я пока что придумал только кривой обходной путь: найти (НАЧАЛО. )((.)+\r)+(?=КОНЕЦ) и покрасить это в какой-нибудь цвет, а затем заменить все крашенные \r на пробелы. Проблема в том, что при этом и нужный \r перед КОНЕЦ тоже удаляется (можно ли исключить \r перед КОНЕЦ?), и перед заменой \r на пробелы его приходится перекрашивать обратно дополнительным ходом.
 
попробуй просто исключить \r перед "КОНЕЦ", должно работать
Вариант окончания (?=\r(КОНЕЦ)) у меня не срабатывает, видимо, потому, что прошлый ((.)+\r)+ этот разрыв строки как раз включает.
 
Чтобы последний Enter не включало:
НАЧАЛО\. (.+\r)+.+(?=\rКОНЕЦ)
 
  • Спасибо
Реакции: Geracl и Serbel
Чтобы последний Enter не включало:
НАЧАЛО\. (.+\r)+.+(?=\rКОНЕЦ)
Спасибо! Это упрощает обходной путь.
Впрочем, исходный вопрос всё ещё актуален: способа убрать лишние \r в одну поиск-замену нет?
 
Я думаю в один проход не получится.
Если бы был один Enter, или хотя бы одинаковое количество...
Или можно убирать первый после начала и запускать
замену до тех пор, пока не перестанет заменять.
Это дольше чем в два прохода.
 
  • Спасибо
Реакции: Serbel
Боюсь, это решение совсем другой, более расхожей проблемы, а не описанной в исходном сообщении :)
Проблему абзаца перед концом вам уже решили.
Осталось понять, что в данном примере лишние абзацы могут всплыть лишь перед началом и приписать впереди \r*
 
приписать впереди \r*
\r*(НАЧАЛО. )(.+\r)+.+(?=\rКОНЕЦ)
Я правильно понял? Если да, то спасибо, это приятное дополнение (хотя и не очень актуальное: там никогда нет лишних пустых абзацев), но это не решение исходной задачи, а именно «удалить все \r в заданном диапазоне» в один проход.
 
Статус
Закрыто для дальнейших ответов.