正则表达式并否定整个字符组
这个问题在这里已经有了答案:
使用负面看法:
^(?!.*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 ===