Regex Negative Lookbacking,只要一个单词之前没有其他单词,就匹配它



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

  1. 我的狗很快乐->应匹配(前面是有效的"我的"(
  2. 狗是人类最好的朋友->应匹配(第一个单词,前面没有任何内容(
  3. 这是无效的猫狗->不应匹配(前面有一个无效单词Cats(
  4. 《狗和猫》和《狗和狗》;应该匹配(找到多个"狗",没有一个紧接着"猫"(
  5. TomCats狗狗是有效的->应该匹配(TomCats这个词本身与Cats不同(

我正在尝试使用类似于以下的正则表达式:

((?<!bCatsb)s*bDogsb)

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

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

((?<!bCatsb)s+bDogsb)

对于情况1和3,它返回正确的结果,但它与情况2不匹配,因为Dogs是在开始时发现的,并且它前面没有空格。

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

如果我清楚地理解您的需求,那么您可以使用带有负先行而非后向的regex:

^(?!.*bCatss+Dogsb).*?bDogsb

RegEx演示

RegEx详细信息:

  • ^:启动
  • (?!.*bCatss+Dogsb):如果我们在任何地方发现单词Cats后跟1+空白后跟单词Dogs,则否定前瞻将导致匹配失败
  • .*?bDogsb:匹配0个或多个字符后的单词Dogs

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

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

最新更新