正则表达式匹配模式,但排除一组单词

时间:2009-07-23 16:15:45

标签: regex

我一直在寻找SO,虽然这个问题已在一个场景中得到解答:

Regex to match all words except a given list

这不是我想要的。我正在尝试编写一个正则表达式,它匹配任何形式[\ w] + [(],但不匹配三个字符串“cat(”,“dog(”和“sheep(”具体)。 / p>

我一直在玩前瞻和后仰,但我无法到达那里。我可能会过于复杂,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:22)

如果正则表达式实现支持look-ahead or look-behind assertions,则可以使用以下命令:

  • 使用负前瞻断言:

     \b(?!(?:cat|dog|sheep)\()\w+\(
    
  • 使用否定的后视断言:

     \b\w+\((?<!\b(?:cat|dog|sheep)\()
    

我添加了标记为word boundary\b锚点。因此catdog(会匹配,但它包含dog(

但是,虽然前瞻性断言得到了正则表达式实现的更广泛支持,但具有后置断言的正则表达式更有效率,因为它仅在前面的正则表达式(在我们的例子中为\b\w+\()已经匹配时才进行测试。然而,在实际正则表达式匹配之前,将在之前测试前瞻断言。因此,在我们的情况下,只要\b匹配,就会测试前瞻断言。

答案 1 :(得分:3)

你真的需要一个正则表达式吗?如果没有,那么最简单的实现只是两个正则表达式 - 一个用来检查你是否与你的一个禁用词匹配,一个用来匹配你的\ w +,用一个逻辑AND链接。