正则表达式里字符串”不包含”匹配技巧

常常咱们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤”hede”字串,但这种写法是错误的。咱们能够这样写:[^hede],但这样的正则表达式彻底是另一个意思,它的意思是字符串里不能包含‘h’,‘e’,‘d’三个但字符。那什么样的正则表达式能过滤出不包含完整“hello”字串的信息呢?php

事实上,说正则表达式里不支持逆向匹配并非百分之百的正确。就像这个问题,咱们就可使用否认式查找来模拟出逆向匹配,从而解决咱们的问题:程序员

^((?!hede).)*$

上面这个表达式就能过滤出不包含‘hede’字串的信息。我上面也说了,这种写法并非正则表达式“擅长”的用法,但它是能够这样用的。web

解释

一个字符串是由n个字符组成的。在每一个字符以前和以后,都有一个空字符。这样,一个由n个字符组成的字符串就有n+1个空字符串。咱们来看一下“ABhedeCD”这个字符串:正则表达式

+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+ S = |e1| A |e2| B |e3| h |e4| e |e5| d |e6| e |e7| C |e8| D |e9| +--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+ index 0 1 2 3 4 5 6 7

全部的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是否是没有“hede”字串,若是没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表达式的“查找”也叫作“zero-width-assertions”(零宽度断言),由于它不会捕获任何的字符,只是判断。express

在上面的例子里,每一个空字符都会检查其前面的字符串是否不是‘hede’,若是不是,这.(点号)就是匹配捕捉这个字符。表达式(?!hede).只执行一次,因此,咱们将这个表达式用括号包裹成组(group),而后用*(星号)修饰——匹配0次或屡次:((?!hede).)*post

你能够理解,正则表达式((?!hede).)*匹配字符串"ABhedeCD"的结果false,由于在e3位置,(?!hede)匹配不合格,它以前有"hede"字符串,也就是包含了指定的字符串。spa

在正则表达式里, ?! 是否认式向前查找,它帮咱们解决了字符串“不包含”匹配的问题。.net

[英文原文: Regular expression to match string not containing a word?  ]

文章来自: 外刊IT评论

相关文章
相关标签/搜索