首页 > 解决方案 > 正则表达式匹配包含“apple”但不匹配同一字符串中的“orange”的字符串

问题描述

鉴于以下数据

green-pineapple-bird
red-apple-dog  
blue-apple-cat  
green-apple-orange-horse  
green-apple-mouse  

我试图弄清楚如何让(Javascript)RegExp.test()匹配包含单词“apple”(任何地方)但不匹配任何包含单词“orange”(任何地方)的条目。结果列表将是:

red-apple-dog  
blue-apple-cat  
green-apple-mouse  

我在数据中包含破折号只是为了更容易阅读。实际数据可能包含也可能不包含破折号。

如果我试试这个:

/^(?!orange).*(apple).*/gm

使用https://regex101.com/它匹配所有行。

使用JavaScript RegEx 排除某些单词/短语?为了获得灵感,我尝试了:

/^(?!.*apple\.(?:orange|butter)).*apple\.\w+.*/gm

如果它有所作为,我正在使用 Mozilla Rhino 1.7R4。

标签: javascriptregexregex-negationregex-group

解决方案


对于不在apple(之前之后)中的每个字符,您需要对orange. 因为您不想pineapple匹配,所以还应该在 : 周围放置单词边界apple

const re = /^((?!orange).)*\bapple\b((?!orange).)*$/;
`green-pineapple-bird
red-apple-dog  
blue-apple-cat  
green-apple-orange-horse  
green-apple-mouse`
  .split('\n')
  .forEach(str => {
    console.log(re.test(str) + ' ' + str)
  });


推荐阅读