Регулярное выражение с использованием отрицательного 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

Стратегии

  1. Вставка временных маркеров

    Начните с выполнения поиска и замены в случаях, в которых вы хотите избежать работы с - в нашем случае - экземплярами flecha[0-9]*\.jpg. Вставьте специальный маркер, чтобы сформировать шаблон, который больше нигде не появляется. В этом примере мы добавим дополнительную информацию . before .jpg, предполагая, что ..jpg не появляется в другом месте. Итак, мы делаем:

    Найти: (flecha[0-9]*)(\.jpg)

    Заменить: $1.$2

    Теперь вы можете искать свой документ для всех других .jpg имен файлов с простым регулярным выражением, например \w+\.jpg или (?<!\.)\.jpg и делать с ними то, что вы хотите. Когда вы закончите, выполните заключительную операцию поиска и замены, где вы заменяете все экземпляры ..jpg с .jpg, чтобы удалить временный маркер.

  2. Использование отрицательного утверждения

    Отрицательное утверждение ожидания может использоваться, чтобы убедиться, что вы не согласны с именами нежелательных файлов:

    (?<!\S)(?!\S*flecha\d*\.jpg)\S+\.jpg

    Разрушение:

    • (?<!\S) гарантирует, что ваш матч начинается с начала имени файла, а не посередине, утверждая, что вашему совпадению не предшествует символ без пробелов.
    • (?!\S*flecha\d*\.jpg) гарантирует, что все, что соответствует, не содержит шаблон, который мы хотим избежать
    • \S+\.jpg - это то, что на самом деле сопоставляется - строка символов без пробелов, за которыми следует .jpg.
  3. Использование нескольких негативных искажений с фиксированной длиной

    Это быстрое (но не очень элегантное) решение для ситуаций, когда шаблон, который вы не хотите сопоставлять, имеет небольшое количество возможных длин.

    Например, если мы знаем, что за flecha следует только до трех цифр, наше регулярное выражение может быть:

    (?<!flecha)(?<!flecha[0-9])(?<!flecha[0-9][0-9])(?<!flecha[0-9][0-9][0-9])\.jpg