Regex Negative Lookbehind,匹配前面没有其他词的词

Regex Negative Lookbehind, match a word as long as is not precede by other word

我正在尝试创建一个简单的正则表达式,我需要在其中捕获所有出现的 Dogs,只要它前面没有另一个词 Cats。以下是一些测试正则表达式的示例:

  1. 我的狗很开心 -> 应该匹配(前面是有效的“我的”)
  2. Dogs are humans best friend -> 应该匹配(第一个单词,前面没有任何内容)
  3. 这是无效的 Cats Dogs -> 不应匹配(前面有一个无效的单词 Cats)
  4. The Dogs and Cats and Dogs and Dogs -> 应该匹配(找到多个“Dogs”并且 none 前面紧跟着“Cats”)
  5. TomCats Dogs 是有效的 -> 应该匹配(TomCats 本身是一个不同于 Cats 的词)

我正在尝试使用与此类似的正则表达式:

((?<!\bCats\b)\s*\bDogs\b)

没有给出正确的结果(它匹配了所有不应该匹配第三种情况的情况)

此外,如果我使用类似的东西:

((?<!\bCats\b)\s+\bDogs\b)

它 returns 案例 1 和 3 的正确结果,但它不匹配案例 2,因为 Dogs 是在开头找到的,并且它前面没有白色 space.

这里区分大小写不是问题。 我正在使用 Java 来测试这个正则表达式

您已经非常接近解决方案了。我认为这个正则表达式应该有效:

(?<!Cats)\s+Dogs|^.{0,4}Dogs

如果我清楚地理解您的要求,那么您可以使用此正则表达式进行否定前瞻而不是后视:

^(?!.*\bCats\s+Dogs\b).*?\bDogs\b

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?!.*\bCats\s+Dogs\b):如果我们发现单词 Cats 后跟 1+ 空格后跟单词 Dogs 任何地方
  • ,则否定前瞻会使匹配失败
  • .*?\bDogs\b:在0个或多个字符
  • 之后匹配词Dogs