正则表达式匹配"非"
首先,正则表达式的"非",代表不想匹配某个字符。
比如字符串 helloword123,/[^0-9]+/g
可以匹配非数字,即匹配结果为 helloword;
同样的,/[^he]+/g
可以匹配非 h
非 e
的字符,匹配结果为 lloword123;
那么 /[^hello]/g
呢?乍一看可能会以为能匹配 word123,其实不然,[^]
内的多个字符是"或"的关系存在的,即它们并不是一个整体,/[^hello]/g
表示 非 h
非 e
非 l
非 o
,并不能理解为 非(hello),所以匹配结果是 w 和 rd123。
道理我们都懂,可我们就是想匹配非某个字符串呢?比如某一字符串若是含有 hello 则无匹配,若是不含 hello 则匹配,写成 [^hello]
是显然不行的,[^(hello)]
呢?其实不起作用。
这时我们需要用到正则表达式的断言—— (?!pattern)
零宽负向先行断言 或者 (? 零宽负向后行断言 均可。
零宽断言是正则表达式中的难点,所以重点从匹配原理方面进行分析。零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点。
这里只介绍一种写法,大家可以都去尝试一下。
/^((?!hello).)+$/
由于断言 (?!hello)
是不占位的,后跟的 .
在原位置匹配任意字符,再用括号将其括起来,用 +
重复一次或多次,前后加上 ^
和 $
,若是字符串中存在 hello,则匹配到 h
字符之前的时候,断言 (?!hello)
匹配失败,正则匹配结果为 false, 若是字符串中不存在 hello,则匹配结果是整个字符串。
用法实战
1、匹配 &
和 ;
之间不含有 test 的字符
str = "hello &test1;test&qout;";
正则表达式:
/&((?!test).)+;/g
匹配结果:
和 &qout;
2、匹配不含有 标签的
标签
str = "<div id='1'><img class='xx'>div><div id='1'><input type='text'>div>";
正则表达式:
/<div[^>]*>((?!<img[^>]*>).)+div>/g
匹配结果:
<div id='1'><input type='text'>div>