如何学好正则,一直是我苦恼的事情,有时候我本身的写的正则,本身也不太明白因此然,抱着试试的态度html
可是我真的很想学好,这里我都会以实例出来,对每一道正则都写上本身的理解(基础部分我就不写,尽可能写一些小细节的点)webpack
部分会参考我看的< <正则指引> > web
竖线| 分隔多选,可是|的优先级特别低,能够用括号把他包起来数组
复杂些|简单写svn
超级强大,惋惜我今天才发现(2019/05/10)函数
默认返回的匹配的项,其余匹配的经过是分组的内容,经过[]获取url
let str = "aaabbb"; /*能够匹配到分组的内容*/ let reg=/(a+)(?:b+)/g; let res = reg.exec(str); console.log(res[1]); let str = "cccddd"; /*能够匹配到分组的内容*/ let reg=/(c+)(d+)/g; let res = reg.exec(str); console.log(res[1]);
第二个参数是函数 let url = "https://www.baidu.com?a=1&b=2"; let reg=/([^&#?+]+)=([^&?#+]+)/g; let obj = {}; //$0 返回总体 $1返回第一个分组 $2 返回第二个分组 url.replace(reg, ($0,$1, $2) => obj[$1] = $2); console.log(obj);
\1 到\10 console.log('aaa bbbb ffffff 999999999'.match(/(\w)(?=\1\1\1)(\1)+/g)); 反向引用的做用一般是用来查找或限定重复、查找或限定指定标识配对 ([a-z])\1{2} 忽略分组 ?: 正向断言 ?= 反向断言 ?! test 判断return false exec 查看分组 search 返回第一个匹配的索引 到不到 -1 match 返回数组 split replace
//找到重复的单词 const str = 'This is the theater you you have been to to'; str.replace(/\b([a-z]+)\s\1\b/ig,(match,...args)=>{ console.log(args[0]); })
环视,在不一样的地方又称之为零宽断言,简称断言。 ?=P 可定顺序 ?!P 否认顺序 ?<=P 确定逆序 ?<!P 否认逆序 console.log(/(http|ftp|svn|abc)ddd/g.test('httpddd'));
.*? 若是换行失败 改为 [\s\S]*?
正整数+一位小数设计
console.log(/^[+]?[1-9]\d*(?:\.\d)?$/.test('+2.1'));
?=P
确定 ?!P
否认code
(?=A)[A-Z]
htm
(?=A) 所在的位置,后面是A
[A-Z] 匹配A-Z中任意一个字母
组合起来
从左到右正则分别匹配环视
(?=A)
和[A-Z]
,因为环视不消耗正则的匹配字符,由于还能对A进行匹配let s1='abcd abcd abbdABCD'; console.log(s1.match(/(?=a)[a-z]/g)); // ["a","a","a"] 字母序列后面跟着; let s1='aaaa;bbb;cccc;dddd;'; console.log(s1.match(/[a-z]+(?=;)/g)); //["aaaa", "bbb", "cccc", "dddd"] 常规匹配 let s1 = 'notexefile1.exe'; console.log(/.+(?=\.exe)/g.exec(s1)); //notexefile1变种用法
确定变种 需求包含字母(不区分大小写),数字,6-16为密码 ^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,16}$ 讲解 使用(?=.*?[a-zA-Z])限定后面的字符中至少有一个字母 使用(?=.*?[0-9])限定后面的字符中至少有一个数字 最后经过实际匹配正则[a-zA-Z0-9]{6,16}限定量词 否认变种 获取不是.exe后缀文件不含后缀的文件名 正则:(.+)(?!\.exe)\.[^.]+$ 确定逆序 (?<=P) js不支持,可是好像是用webpack的时候是支持的 需求:获取name参数的值 正则:(?<=name=).+ 示例很直白,前面必须是name=,而后获取其后面的数据 let s1 = 'name=Zjmainstay'; console.log(/(?<=name=).+/g.exec(s1));// Zjmainstay正则分块组合法-必须包含字母、数字、特殊字符
正则:
^(?=.*?[a-z])(?=.*?\d)(?![a-z\d]+$).+$
解析:
(?=.*?[a-z])
限制必须有字母
(?=.*?\d)
限制必须有数字
(?![a-z\d]+$)
限制从开头到结尾不能全为数字和字母
.+
在没有限定的状况下能够是任意字符^
和$
限定字符串的开头和结尾正则逐步完善法-排除特定标签
p/a/img
,匹配html标签正则:
</?(?!p|a|img)([^> /]+)[^>]*/?>
从简单标签入手,对于
</p>
和<br />
,写出正则:</?[^>]*/?>
咱们观察可得,标签名是这样获得的:
无属性值:<p> <([^>]+) 有属性值:<p class <([^ ]+) 无属性值自闭合:<br/> <([^/]+) 闭合标签:</p> </([^>]+)>获得正则:
</?([^> /]+)最后,咱们须要排除
p/a/img
标签,用否认顺序法,在标签名前面加入否认环视:</?(?!p|a|img)([^> /]+)[^>]*/?>
正则减除查错法-匹配异常缘由查找
<ul> <li class="item">item1</li> <li class="item">item2</li> <li class="item bug">item3</li> <li class="item">item4</li> <li class="item">item5</li> </ul>正则:
<li class="item">(.*?)</li>
问题
"item bug"
怎么解决正则
<li class="item[^"]*"
最终的正则
<li class="item[^"]*">(.*?)</li>
https://www.zybuluo.com/Zjmainstay/note/709093
匹配个数为偶数且不能为空
/^(..)+$/
正则查找不包含某些字符串
^((?!不想包含的字符串).)*$ 解释 (?!不想包含的字符串) //是匹配位置 .是任意字符 表达式(?!hede).只执行一次 匹配0次或屡次:((?!hede).)*
需求:匹配每行数据中以.jpg/.jpeg/.png/.gif结尾的图片名称(含后缀)
.+(?=\.(jpg|jpeg|png|gig)).+
......................................................................................................................................................................................................................................................................................................................................................................................................................