正则表达式匹配"非"

db53d4c5ededbd1838ceb39f9b386c68.png

首先,正则表达式的"非",代表不想匹配某个字符。

比如字符串 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) 零宽负向先行断言 或者 (?<!pattern) 零宽负向后行断言 均可。

零宽断言是正则表达式中的难点,所以重点从匹配原理方面进行分析。零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点。

这里只介绍一种写法,大家可以都去尝试一下。

/^((?!hello).)+$/

由于断言 (?!hello) 是不占位的,后跟的 . 在原位置匹配任意字符,再用括号将其括起来,用 + 重复一次或多次,前后加上 ^ 和 $,若是字符串中存在 hello,则匹配到 h 字符之前的时候,断言 (?!hello) 匹配失败,正则匹配结果为 false, 若是字符串中不存在 hello,则匹配结果是整个字符串。

用法实战

1、匹配 & 和 ; 之间不含有 test 的字符

str = "hello&nbsp;&test1;test&qout;";

正则表达式:

/&((?!test).)+;/g

匹配结果:&nbsp; 和 &qout;

2、匹配不含有 <img> 标签的 <div></div> 标签

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>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值