【问题标题】:Regex: Match word not containing正则表达式:匹配不包含的单词
【发布时间】:2016-01-14 13:55:04
【问题描述】:

我有以下几句话:

EFI Internal Shell
EFI Hard Drive
EFI Drive

我想匹配包含 EFI 但不包含 Drive 的单词。所以只有最上面的单词(EFI Internal Shell)应该匹配。

如何在正则表达式中做到这一点?

我浏览了 SO,但没有一个答案能让我走上正轨。

例如:Regular expression that doesn't contain certain string 表示使用 ^((?!my string).)*$,但表示使用 didn't work。甚至匹配任何不包含 Drive 的字符串。

有什么建议吗?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您的^((?!Drive).)*$ 根本不起作用,因为您针对多行输入进行了测试。

    您应该使用/m 修饰符来查看what the regex matches。它只匹配不包含Drive 的行,但tempered greedy token 不会检查EFI 是否在字符串内。

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

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

    使用类似的东西

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

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

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

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

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

    regex demo

    这里,

    • ^ - 匹配字符串的开头
    • (?!.*Drive) - 确保字符串中没有“Drive”(因此,Drives 是不允许的)
    • (?!.*\bDrive\b) - 确保字符串中没有“Drive”作为整个单词(因此,Drives 是允许的)
    • .* - 除换行符之外的任何 0+ 个字符,尽可能多
    • EFI - 一个EFI 子字符串
    • .* - 除换行符之外的任何 0+ 个字符,尽可能多。

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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多