
Не могли бы вы помочь мне узнать, как использовать функцию 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,здесь- просто введите разделители и текст, а затем нажмите «Отправить».
Что касается объяснения: он разделяется по разделителю начала, затем для каждого «блока» он разделяется по разделителю конца. Мы получаем блок текста, который находится между началом и концом, и выполняем замену на нем. Затем мы снова соединяем разделенные блоки. Это не самый эффективный способ, но он немного проще, чем обработка отдельных символов.
Старое, частично работающее решение 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
и используйте «Заменить все» НЕСКОЛЬКО РАЗ (заменит только один — в каждой строке за один клик).