Я бы порекомендовал вам полностью отказаться от регулярных выражений - просто слишком сложно заставить его работать в подобных случаях. Не все можно легко решить с помощью регулярных выражений! В этом случае большинство языков сценариев могут сделать это довольно легко. Я написал фрагмент JavaScript для вас здесь - просто введите разделители и введите, и нажмите кнопку Отправить.
Что касается объяснения: он разделяется по начальному разделителю, затем для каждого «блока» он разделяется по конечному разделителю. Мы заканчиваем блоком текста, который находится между началом и концом, и выполняем замену этого. Затем мы снова соединяем блоки. Это не самый эффективный способ, но он немного проще, чем обработка отдельных символов.
Старое, частично работающее, регулярное выражение лежит ниже. Я сильно рекомендую вам не использовать его.
Быстрый ответ: не используйте Notepad++, используйте этот фрагмент JS (введите текст справа внизу и нажмите «Отправить»). Замените START
и END
в сценарии слева внизу, если необходимо.
Кроме того, вы можете использовать PowerShell, который является родным для Windows (Vista+):
Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt
Замените input.txt
и output.txt
соответственно. Примечание: они должны быть разными файлами.
Это конкретное решение работает без ошибок, только если у вас есть только одно вхождение START
на строку и одно вхождение END
на строку, и они не охватывают строки - поэтому мы можем работать с каждой строкой независимо.
Учитывая гарантии, что для каждой строки потребуется только одно совпадение, и каждое совпадение содержится в строке, совпадающей с (?<=START.*?)-(?=.*?END)
и замена на один пробел будет работать - за исключением того, что Notepad++, похоже, не нравится этот конкретный шаблон. Он поддерживает lookbehinds и lookaheads (очевидно, полный PCRE), но в этом есть что-то, что его сбивает с толку.
Альтернатива, которая аналогична тому, что Йоханнес уже ответил, заключается в использовании простого шаблона: (START.*?)-(.*?END)
и замените его на \1 \2
. Проблема здесь в том, что это будет соответствовать только одному дефису на строку за раз. Это быстро становится утомительным.
Здесь мы пытаемся использовать более полный язык сценариев. JavaScript - хорошая альтернатива. Тем не менее, он не поддерживает внешний вид. С другой стороны, мы можем запускать циклы, так что предыдущее утомительное решение действительно жизнеспособно. Я создал пример здесь.