Регулярное выражение с использованием отрицательного lookbehind не работает в Notepad ++
У меня есть исходный файл с буквально сотнями вхождений строк flecha.jpg
и flecha1.jpg
, но мне нужно найти вхождения любого другого .jpg
изображения (т.е. casa.jpg
, moto.jpg
, что угодно)
Я попытался использовать регулярное выражение с отрицательным lookbehind, как это:
(?<!flecha|flecha1).jpg
но это не сработает! Notepad++ просто говорит, что это недопустимое регулярное выражение.
Я пробовал регулярное выражение где-то еще, и он работает, вот пример, поэтому я думаю, что это проблема с обработкой NPE регулярных выражений или синтаксисом lookbehinds/lookaheads.
Итак, как я мог достичь такого же результата регулярного выражения на АЭС?
Если это полезно, я использую Notepad++ версию 6.3 Unicode
В дополнение, если вы так добры, то какой синтаксис должен был бы достичь того же, но с дополнительными номерами (в данном случае только "1") в качестве суффикса моей строки? (даже если он не работает на АЭС, просто чтобы узнать)...
Я пробовал (?<!flecha[1]?).jpg
но он не работает. Он должен работать так же, как и другое регулярное выражение, см. Здесь (RegExr)
Ответы
Ответ 1
Notepad++, похоже, не реализовал внешний вид с переменной длиной (это происходит с некоторыми инструментами). Обходным путем является использование более одного фиксированного вида:
(?<!flecha)(?<!flecha1)\.jpg
Как вы можете проверить, совпадения совпадают. Но это работает с npp.
Заметьте, я убежал .
, поскольку вы пытаетесь сопоставить расширения, то, что вы хотите, является буквальным .
, То, как вы это делали, было подстановочным знаком - может быть любым персонажем.
О дополнительном вопросе, к сожалению, поскольку мы не можем иметь зависания переменной длины, невозможно иметь необязательные суффиксы (числа) без наличия нескольких обратных задержек.
Ответ 2
Знаете ли вы, что вы только сопоставляете (в смысле потребления) расширение (.jpg
)? Я думаю, вы хотели бы сопоставить все имя файла, нет? И это гораздо легче сделать с помощью взгляда:
\b(?!flecha1?\b)\w+\.jpg
Первый \b
привязывает совпадение к началу имени (предполагая, что это действительно имя файла, на которое мы смотрим). Тогда (?!flecha1?\b)
утверждает, что имя не flecha
или flecha1
. Как только это будет сделано, \w+
имя. Затем \.jpg
захватывает расширение, чтобы закончить матч.
Ответ 3
Решение проблемы ограничения переменной длины-отрицательного искажения в Notepad++
Здесь приведены несколько стратегий для работы с этим ограничением в Notepad++ (или с любым двигателем с регулярным выражением с тем же ограничением)
Определение проблемы
Notepad++ не поддерживает использование отрицательных утверждений lookback для переменной длины, и было бы неплохо иметь некоторые обходные пути. Давайте рассмотрим пример в исходном вопросе, но предположим, что мы хотим избежать появления файлов с именем flecha
с любым количеством цифр после flecha
и с любыми символами перед flecha
. В этом случае регулярное выражение, использующее отрицательный lookbehind переменной длины, будет выглядеть следующим образом (?<!flecha[0-9]*)\.jpg
.
Строки, которые мы не хотим сопоставлять в этом примере
-
flecha.jpg
-
flecha1.jpg
-
flecha00501275696.jpg
-
aflecha.jpg
-
img_flecha9.jpg
-
abcflecha556677.jpg
Стратегии
-
Вставка временных маркеров
Начните с выполнения поиска и замены в случаях, в которых вы хотите избежать работы с - в нашем случае - экземплярами flecha[0-9]*\.jpg
. Вставьте специальный маркер, чтобы сформировать шаблон, который больше нигде не появляется. В этом примере мы добавим дополнительную информацию .
before .jpg
, предполагая, что ..jpg
не появляется в другом месте. Итак, мы делаем:
Найти: (flecha[0-9]*)(\.jpg)
Заменить: $1.$2
Теперь вы можете искать свой документ для всех других .jpg
имен файлов с простым регулярным выражением, например \w+\.jpg
или (?<!\.)\.jpg
и делать с ними то, что вы хотите. Когда вы закончите, выполните заключительную операцию поиска и замены, где вы заменяете все экземпляры ..jpg
с .jpg
, чтобы удалить временный маркер.
-
Использование отрицательного утверждения
Отрицательное утверждение ожидания может использоваться, чтобы убедиться, что вы не согласны с именами нежелательных файлов:
(?<!\S)(?!\S*flecha\d*\.jpg)\S+\.jpg
Разрушение:
-
(?<!\S)
гарантирует, что ваш матч начинается с начала имени файла, а не посередине, утверждая, что вашему совпадению не предшествует символ без пробелов. -
(?!\S*flecha\d*\.jpg)
гарантирует, что все, что соответствует, не содержит шаблон, который мы хотим избежать -
\S+\.jpg
- это то, что на самом деле сопоставляется - строка символов без пробелов, за которыми следует .jpg
.
-
Использование нескольких негативных искажений с фиксированной длиной
Это быстрое (но не очень элегантное) решение для ситуаций, когда шаблон, который вы не хотите сопоставлять, имеет небольшое количество возможных длин.
Например, если мы знаем, что за flecha
следует только до трех цифр, наше регулярное выражение может быть:
(?<!flecha)(?<!flecha[0-9])(?<!flecha[0-9][0-9])(?<!flecha[0-9][0-9][0-9])\.jpg