#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))
: лениво сопоставьте все, начиная с^
tillcat
или adog
. ИспользуетсяK
для отбрасывания строки, сопоставленной здесь.(?>^.*?K(?:cat|(dog)))
: Заключите его в атомарную группу,(?>)
, чтобы предотвратить возврат. Таким образом, в случае, если cat был сопоставлен первым в строке, движок не будет возвращаться к соответствию dog .
(?(1)|$.^)
: Если группа 1 совпадает, то ветвь равна нулю, поэтому совпадение является успешным, иначе попробуйте сопоставить с невозможным шаблоном$.^
Демонстрация: https:// regex101.com/r/omsG46/1/
Спасибо
Комментарии:
1. Вы уверены, что знаете свое дело! Спасибо!