Как заменить определенный символ между определенными словами?

Как заменить определенный символ между определенными словами?

Не могли бы вы помочь мне узнать, как использовать функцию Notepad++ Find/Replace для замены определенного символа между определенными словами. Пожалуйста, посмотрите пример ниже, я хотел бы найти все дефисы между словами 'START' и 'END' и заменить их пробелами. Все остальные дефисы в документе не будут заменены.

Я пытался решить эту проблему, используя примеры регулярных выражений, найденные в Google, но, к сожалению, пока безуспешно.

Вот что у меня есть:

START-Hyphens-should-be-replaced-here-01-END
OTHER-no-changes-here-02-WORD
START-Hyphens-should-also-be-replaced-here-03-END
OTHER-no-changes-here-either-04-TEXT

Вот что я хотел бы получить:

START Hyphens should be replaced here 01 END
OTHER-no-changes-here-02-WORD
START Hyphens should also be replaced here 03 END
OTHER-no-changes-here-either-04-TEXT

решение1

Я бы рекомендовал вам полностью отказаться от регулярных выражений — слишком много хлопот, чтобы заставить их работать в таких случаях. Не все можно легко решить с помощью регулярных выражений! В этом случае большинство скриптовых языков могут сделать это довольно легко. Я написал для вас фрагмент JavaScript,здесь- просто введите разделители и текст, а затем нажмите «Отправить».

Что касается объяснения: он разделяется по разделителю начала, затем для каждого «блока» он разделяется по разделителю конца. Мы получаем блок текста, который находится между началом и концом, и выполняем замену на нем. Затем мы снова соединяем разделенные блоки. Это не самый эффективный способ, но он немного проще, чем обработка отдельных символов.

xkcd - Проблемы с Perl


Старое, частично работающее решение regex находится ниже. Ятяжелорекомендуем вам не использовать его.

Быстрый ответ: не используйте 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++, похоже, не любит этот конкретный шаблон. Он поддерживает просмотры назад и вперед (полный PCRE, судя по всему), но в этом есть что-то, что сбивает его с толку.

Альтернатива, которая похожа на то, на что уже ответил Йоханнес, — использовать простой шаблон: (START.*?)-(.*?END)и заменить его на \1 \2. Проблема здесь в том, что это будет соответствовать толькоодиндефис на строку за раз. Это быстро надоедает.

Здесь мы пытаемся использовать более полный язык сценариев. JavaScript является хорошей альтернативой. Однако онне делаетподдержка lookbehinds. С другой стороны, мы можем запускать вещи в цикле, так что предыдущее утомительное решение на самом деле жизнеспособно. Я создал примерздесь.

решение2

Подходящим регулярным выражением будет (START[^\-]*)-(.*END), замените его на \1 \2и используйте «Заменить все» НЕСКОЛЬКО РАЗ (заменит только один — в каждой строке за один клик).

Связанный контент