【问题标题】:Match every word except those listed匹配除列出的单词之外的所有单词
【发布时间】:2013-01-30 16:11:15
【问题描述】:

我的问题是,如果字符串包含除我列出的单词之外的任何单词,我需要匹配。

例如,我可能有这个被批准的列表:

User1
User2

这里有两个应该匹配和不应该匹配的示例。

应该匹配(因为 User3 未被批准):

User1
User2
User3

不应该匹配(因为列出的每个字符串都在批准列表中):

User1

我尝试过环视断言,但它们在尝试匹配时实际上并没有消耗字母,因此使用"User1\r\nUser2" 之类的字符串,我会得到"ser1\r\n" 之类的匹配项。我想知道除了我认为允许的词之外是否还有其他词。

我无法使用编程语言来做到这一点;我只被允许将正则表达式交给程序。语言将是 Perl。

【问题讨论】:

    标签: regex perl word match


    【解决方案1】:

    /\b((?!(User1\b|User2\b)).+?)\b/ 是否符合您的要求?

    \b 表示分词,即单词和非单词字符之间的间隙(零宽度)。

    ?! 表示负前瞻断言(也是零宽度)。

    .+? 被用于捕获与排除的单词不匹配的任何内容。

    希望这会有所帮助。

    【讨论】:

    • 如果我们想捕获坏词,\w+.+? 会比.+ 好,后者会抓取到字符串的末尾。如果我们只想要布尔匹配测试,我想/\b(?!(User1|User2)\b)\S/ 就可以了。
    • @AgileTillIDie 是的,在编辑之后,这似乎完全符合我的要求。我不认为这是可能的。非常好。
    【解决方案2】:
    \b(?!(User1|User2))\w+\b
    

    这应该匹配“|”中未列出的任何单词分隔列表

    【讨论】:

    • 正如 aschepler 所评论的,这与以 User1User2 开头的用户名不匹配。
    【解决方案3】:
    /\b(?!User[12]\b)\w+/
    

    将匹配除User1User2 之外的任何单词(包含a-zA-Z0-9_ 的字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多