正则表达式并否定整个字符组

这个问题在这里已经有了答案:

  • 正则表达式匹配不包含单词的行吗? 25个答案

  • 使用负面看法:

    ^(?!.*ab).*$
    

    更新:在下面的评论中,我表示这种方法比Peter的答案慢。 从那时起我已经运行了一些测试,发现它确实稍快一点。 然而,喜欢这种技术的原因不在于速度,而在于简单性。

    另一种在这里描述为贪婪的贪婪标记的技术适用于更复杂的问题,如匹配分隔符由多个字符组成的分隔文本(如Luke在下面评论的HTML)。 对于问题中描述的问题,这是过度杀伤力。

    对于任何感兴趣的人,我都会测试一大块Lorem Ipsum文本,计算不包含“quo”一词的行数。 这些是我使用的正则表达式:

    (?m)^(?!.*bquob).+$
    
    (?m)^(?:(?!bquob).)+$
    

    无论我是在整个文本中搜索匹配,还是将其分解成行并单独匹配,锚定的预测始终优于浮动预测。


    使用诸如[^ab]类的字符类将匹配不在字符集内的单个字符。 ( ^是否定部分)。

    要匹配不包含多字符序列ab的字符串,您需要使用负面预览:

    ^(?:(?!ab).)+$
    


    上述表达式在正则表达式注释模式中是:

    (?x)    # enable regex comment mode
    ^       # match start of line/string
    (?:     # begin non-capturing group
      (?!   # begin negative lookahead
        ab  # literal text sequence ab
      )     # end negative lookahead
      .     # any single character
    )       # end non-capturing group
    +       # repeat previous match one or more times
    $       # match end of line/string
    

    是的,它被称为负面预测。 它是这样的 - (?!regex here) 。 所以abc(?!def)会匹配abc 而不是 def。 所以它会匹配abce,abc,abck等。

    同样有积极的前瞻 - (?=regex here) 。 所以abc(?=def)将匹配abc和def。

    也有负面和积极的lookbehind - (?<!regex here)(?<=regex here)

    需要注意的一点是,负向预测是零宽度。 也就是说,它不算占有任何空间。

    所以它可能看起来像a(?=b)c将匹配“abc”,但它不会。 它会匹配'a',然后用'b'匹配正向预览,但它不会向前移动到字符串中。 然后它会尝试将'c'和'b'相匹配,这是行不通的。 同样, ^a(?=b)b$将匹配'ab'而不是'abb',因为lookaround是零宽度(在大多数正则表达式实现中)。

    更多信息在此页面上

    链接地址: http://www.djcxy.com/p/13369.html

    上一篇: Regular Expressions and negating a whole character group

    下一篇: JavaScript checking for null vs. undefined and difference between == and ===