Как заменить определенный символ между конкретными словами?
Не могли бы вы помочь мне выяснить, как я могу использовать функцию поиска / замены Notepad++ для замены определенного символа между конкретными словами. Пожалуйста, посмотрите пример ниже, я хотел бы найти все дефисы между словами "START" и "END" и заменить их пробелами. Все другие дефисы в документе не будут заменены.
Я пытался решить эту проблему, используя примеры регулярных выражений, которые я гуглил, но, к сожалению, пока не добился успеха.
Вот что у меня есть:
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
2 ответа
Я бы порекомендовал вам полностью отказаться от регулярных выражений - просто слишком сложно заставить его работать в подобных случаях. Не все можно легко решить с помощью регулярных выражений! В этом случае большинство языков сценариев могут сделать это довольно легко. Я написал фрагмент 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 - хорошая альтернатива. Тем не менее, он не поддерживает внешний вид. С другой стороны, мы можем запускать циклы, так что предыдущее утомительное решение действительно жизнеспособно. Я создал пример здесь.
Подходящее регулярное выражение будет (START[^\-]*)-(.*END)
замените это на \1 \2
и используйте "Заменить все" НЕСКОЛЬКО РАЗ (заменит одно - на каждой строке за клик).