Регулярное выражение соответствует слову, только если оно не следует за другим словом

#regex #match #word #lookbehind

#регулярное выражение #совпадение #слово #посмотрите назад

Вопрос:

Используя регулярное выражение, как я могу сопоставить слово, только если оно не следует за другим словом?

например
, я хочу сопоставить слово «собака», если слово «кошка» не появляется перед ним

the fox jumps over the dog — Совпадение
a cat cannot jump over a big dog — Нет совпадения
Hello dog, I'm cat — Совпадение
Hello cat, I'm dog — Нет совпадения

Я попробовал следующее:
(?<!cat.*)dog

Однако квантификатор внутри отрицательного внешнего вида не работает.

Решение этой проблемы было бы высоко оценено!

Комментарии:

1. Извините, отрицательные ссылки должны быть фиксированного размера в большинстве движков регулярных выражений, поэтому вы не можете их иметь .* .

2. Проверка regex101.com

3.Если K поддерживается ^[^crn]*(?:c(?<!bc(?=atb))[^crn]*)*bKdogb regex101.com/r/gG2jZe/1 В противном случае вы могли бы использовать группу захвата regex101.com/r/4Hd85F/1

Ответ №1:

В PCRE с поддержкой атомной группы, условных выражений и K, приведенное ниже регулярное выражение может помочь в сопоставлении.

Шаблон: (?>^.*?K(?:cat|(dog)))(?(1)|$.^)

Разбивка:

  • (?>^.*?K(?:cat|(dog)))
    • (?:cat|(dog)) : сопоставьте кошку или собаку. cat имеет приоритет. Если dog совпадает, запишите его group 1 .
    • ^.*?K(?:cat|(dog)) : лениво сопоставьте все, начиная с ^ till cat или a dog . Используется K для отбрасывания строки, сопоставленной здесь.
    • (?>^.*?K(?:cat|(dog))) : Заключите его в атомарную группу, (?>) , чтобы предотвратить возврат. Таким образом, в случае, если cat был сопоставлен первым в строке, движок не будет возвращаться к соответствию dog .
  • (?(1)|$.^) : Если группа 1 совпадает, то ветвь равна нулю, поэтому совпадение является успешным, иначе попробуйте сопоставить с невозможным шаблоном $.^

Демонстрация: https:// regex101.com/r/omsG46/1/

Спасибо

Комментарии:

1. Вы уверены, что знаете свое дело! Спасибо!