2

Не могли бы вы помочь мне выяснить, как я могу использовать функцию поиска / замены 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 ответа2

5

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

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

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


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

Быстрый ответ: не используйте 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 - хорошая альтернатива. Тем не менее, он не поддерживает внешний вид. С другой стороны, мы можем запускать циклы, так что предыдущее утомительное решение действительно жизнеспособно. Я создал пример здесь.

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .