正则表达式:匹配不包含特定单词的文本

20

我有以下这些话:

EFI Internal Shell
EFI Hard Drive
EFI Drive

我想匹配包含EFI但不包含Drive的单词。因此,只有顶部的单词(EFI Internal Shell)应该匹配。

如何在正则表达式中实现这一点?

我查看了Stack Overflow上的所有答案,但没有一个能让我找到正确的方法。

例如:不包含某个字符串的正则表达式建议使用^((?!my string).)*$,但是无法使用,甚至无法匹配任何不包含Drive的字符串。

有什么提示吗?

1个回答

31

你的正则表达式^((?!Drive).)*$完全不起作用,因为你测试的是多行输入。

你应该使用/m修饰符来查看正则表达式匹配。它只匹配不包含Drive的行,但这个贪婪标记并没有检查EFI是否在字符串中。

实际上,在这里使用$锚点是多余的,因为.*匹配除换行符以外的任何零个或多个字符。你可以从模式中简单地删除它。

(注意:在.NET中,你需要使用[^\r\n]*代替.*,因为.NET模式中的.匹配除了换行符、LF字符之外的任何字符,并匹配所有其他换行符,如回车符、CR等)。

使用类似于

^(?!.*Drive).*EFI.*

或者,如果您只需要在 Drive 作为一个整个单词存在时才使匹配失败:

^(?!.*\bDrive\b).*EFI.*

或者,如果您想用更多的词来表示失败:

^(?!.*(?:Drive|SomethingElse)).*EFI.*
^(?!.*\b(?:Drive|SomethingElse)\b).*EFI.*

看到 正则表达式演示

在这里,

  • ^ - 匹配字符串的开头
  • (?!.*Drive) - 确保字符串中没有 "Drive"(所以不允许 Drives
  • (?!.*\bDrive\b) - 确保字符串中没有 "Drive" 作为一个整体单词(所以允许 Drives
  • .* - 除了换行符之外的任意0个或多个字符,尽可能多地匹配
  • EFI - 一个EFI子字符串
  • .* - 除了换行符之外的任意0个或多个字符,尽可能多地匹配。

如果您的字符串有换行符,请使用/s dotall修饰符或将.替换为[\s\S]


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