跳到正文
当下的七炎
返回

正则表达式-零宽断言

编辑文章

先看一下零宽度正预测先行断言( 格式为 (?=exp) ) 我们来看一下

var reg = /(?=a)b/;  
reg.exec("ab");//null

零宽断言 断言的是后面出现的东西,所以上一个正则表达式永远匹配不到东西 改一下

var reg = /(?=a)\wb/;  
reg.exec("cabd");//ab

当我看到这的时候我想这不是和/ab/一个意思了?其实不是的 这里的ab 是\wb 零宽断言一般是放后面匹配的,来看一下这个例子

var reg = /123(?=abc)/;  
reg.exec("aaa123abcsss"); 
["123"]

(?=abc)这个东西只参与匹配不捕获 下面我们来匹配一个字符串

设:有字符串 var s = ‘aaalllsss9tAAAnnn999’; 问:请找出所有在 “9” 前的相邻 3个连续相同字符

因为正则的exec一直匹配一个,这里我们用JavaScript中字符串的match方法

var s = 'aaalllsss9tAAAnnn999';
s.match(/(\w)\1{2}(?=9)/g)
["sss", "nnn"]

这样只能断言后面的,应该要有反向零宽断言才是 再来看一下(?!)用法

设:有字符串 var web_development = “python php ruby javascript jsonp”; 问:请找出所有含有p但是不含有on的单词

web_development.match(/\b(?=\w*p)(?!\w*on)\w*\b/g)
["php", "javascript"]

(?<=exp)也挺好用的,JavaScript不支持 比如我们要匹配这段字符串[]中的数字

群里看到了一个题目

问个问题啊:【小题1】skdasdajs阿斯顿d 【小题2】asdasdagasfga【小题3】GSDS刷卡机啊手机打,怎么匹配【小题N】及后面的内容啊

这个问题的难点是匹配最后一个 下面是代码

'问个问题啊:【小题1】skdasdajs阿斯顿d 【小题2】asdasdagasfga【小题3】GSDS刷卡机啊手机打,怎么匹配【小题N】及后面的内容啊求大神出来求教'.match(/【小题\w+.*?(?=【小题\w+)/g)
["【小题1】skdasdajs阿斯顿d ", "【小题2】asdasdagasfga", "【小题3】GSDS刷卡机啊手机打,怎么匹配"]
'问个问题啊:【小题1】skdasdajs阿斯顿d 【小题2】asdasdagasfga【小题3】GSDS刷卡机啊手机打,怎么匹配【小题N】及后面的内容啊求大神出来求教'.match(/【小题\w+】(([\s\S]*?)(?=【小题\w+】)|([\s\S]*?)$)/g)
["【小题1】skdasdajs阿斯顿d ", "【小题2】asdasdagasfga", "【小题3】GSDS刷卡机啊手机打,怎么匹配", "【小题N】及后面的内容啊求大神出来求教"]

下面这个例子具有代表性 校验密码必须包含字母、数字和特殊字符,6-16位

需求:校验密码必须包含字母、数字和特殊字符,6-16位,假定特殊字符为 -_= 三个字符
源串:
12345
123456
1234561234561234
12345612345612345
a1234
a12345
-1234
-12345
a-123
a-1234
a-1234a-1234a-12
a-1234a-1234a-1234
aaaaa
aaaaaa
-_=-_
-_=-_=
预期:匹配
a-1234
a-1234a-1234a-12
/^(?=.*?[a-zA-Z])(?=.*?[0-9])((?=.*?[-_=])).{6,16}$/gm

参考 正则表达式30分钟入门教程 掘金的一篇文章 正则表达式之:零宽断言不『消费』 教你怎么理解正则表达式之零宽断言(环视) 深入正则表达式应用 正则掌握程度测试题


编辑文章
分享这篇文章:

评论

使用 GitHub 账号登录后即可评论


上一篇
JavaScript常问代码片段
下一篇
我认为使用原生JavaScript不适合开发