我正在尝试创建一个简单的正则表达式,其中我需要捕获所有出现的Dog,只要它前面没有另一个单词Cats。以下是一些测试正则表达式的示例:
- 我的狗很快乐->应匹配(前面是有效的"我的"(
- 狗是人类最好的朋友->应匹配(第一个单词,前面没有任何内容(
- 这是无效的猫狗->不应匹配(前面有一个无效单词Cats(
- 《狗和猫》和《狗和狗》;应该匹配(找到多个"狗",没有一个紧接着"猫"(
- 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