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

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

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

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

Однако квантификатор внутри отрицательного просмотра назад не работает.

Решение этого было бы greeeaaatly оценено!


person Murphy    schedule 18.12.2020    source источник
comment
Извините, в большинстве движков регулярных выражений отрицательный просмотр назад должен иметь фиксированный размер, поэтому вы не можете иметь там .*.   -  person Barmar    schedule 18.12.2020
comment
Оформить заказ regex101.com   -  person william3031    schedule 18.12.2020
comment
Если \K поддерживается ^[^c\r\n]*(?:c(?<!\bc(?=at\b))[^c\r\n]*)*\b\Kdog\b regex101.com/r/gG2jZe/1, в противном случае вы можете использовать захват группа regex101.com/r/4Hd85F/1   -  person The fourth bird    schedule 18.12.2020


Ответы (1)


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

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

Разбивка:

  • (?>^.*?\K(?:cat|(dog)))

    • (?:cat|(dog)) : сопоставьте кошку или собаку. cat имеет приоритет. Если dog совпадает, зафиксируйте его в group 1.

    • ^.*?\K(?:cat|(dog)): лениво сопоставить все от ^ до cat или dog. Используйте \K, чтобы отбросить совпадающую здесь строку.

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

  • (?(1)|$.^): Если группа 1 совпала, тогда ветвь будет нулевой, поэтому совпадение будет успешным, в противном случае попытайтесь сопоставить невозможный шаблон $.^

Демо: https://regex101.com/r/omsG46/1/

Спасибо

person Prasanna    schedule 18.12.2020
comment
Вы точно знаете свое дело! Спасибо! - person Murphy; 21.12.2020