正则表达式排除,查找不跟随另一个单词的单词

53

我正在尝试搜索所有不紧随“Thumb”出现的“Tom”。

我已经尝试查找

Tom ^((?!Thumb).)*$

但我仍然得到与Tom Thumb匹配的行。


2
即使在这样一个简单的情况下,拥有一些示例输入和预期输出也总是很有帮助的。例如,你想匹配只是'Tom'还是'Tom + 一行的剩余部分'? - alan
我会尽量更明确地表达。我想在一行中找到“Tom”的任何出现,但我不想看到包含“Tom Thumb”的任何行。 - user1364539
3个回答

51

你没有说明你使用的正则表达式是哪一种,但是这个通用的方法应该可以解决问题:

 Tom(?!\s+Thumb)

1
你可能认为它适用于像"TomThumb"(它们之间没有空格)这样的情况。为了使其正常工作,您需要从正则表达式中删除"\s+"。例如:Tom(?!Thumb) - Leonardo Montenegro

35

如果您不是在查找完整单词,您可以使用以下正则表达式:

Tom(?!.*Thumb)

如果在想要匹配之后还有更多的单词需要检查,您可以使用

Tom(?!.*(?:Thumb|Finger|more words here))
Tom(?!.*Thumb)(?!.*Finger)(?!.*more words here)

要使.匹配换行,请参考如何在正则表达式中跨多行匹配任何字符?

请查看此正则表达式演示

如果你正在寻找整个单词(即只有当单词Tom右侧没有整个单词Thumb时才进行匹配),请使用

\bTom\b(?!.*\bThumb\b)

请查看另一个正则表达式演示

注意:

  • \b - 匹配前导/尾随单词边界
  • (?!.*Thumb) - 是一个负向先行断言(negative lookahead),如果有任何0个或多个字符(取决于具体引擎是否包含/排除换行符号),后面跟着 Thumb ,则匹配失败。

我永远无法掌握正则表达式 :S - Josh Woodcock

1

Tom(?!\s+Thumb) 是你要搜索的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接