首页 > 解决方案 > 正则表达式仅在单词不跟随另一个单词时才匹配单词

问题描述

使用正则表达式,只有当它不跟随另一个单词时,我如何才能匹配一个单词?

例如
,如果单词“cat”之前没有出现,我想匹配单词“dog”

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

但是,否定后视内的量词不起作用。

对此的解决方案将不胜感激!

标签: regexmatchwordlookbehind

解决方案


在支持Atomic GroupConditionals\K的 PCRE 中,下面的正则表达式可以帮助匹配。

图案: (?>^.*?\K(?:cat|(dog)))(?(1)|$.^)

分解:

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

    • (?:cat|(dog)): 匹配猫或狗。cat被优先考虑。如果dog匹配,则将其捕获在group 1.

    • ^.*?\K(?:cat|(dog)): 懒惰地匹配从^tillcat或 a 的所有内容dog。用于\K丢弃此处匹配的字符串。

    • (?>^.*?\K(?:cat|(dog))): 将其包含在原子组中,(?>),因此可以防止回溯。因此,如果 cat 在字符串中首先匹配,引擎将不会回溯到匹配 dog。

  • (?(1)|$.^): 如果组 1 匹配,分支为空,所以匹配成功,否则尝试匹配不可能的模式$.^

演示: https ://regex101.com/r/omsG46/1/

谢谢


推荐阅读