先看一下零宽度正预测先行断言( 格式为 (?=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 账号登录后即可评论