前言
正则表达式应用太广泛了,遍布于各端程序猿日常编码中。
这里只是做学习补充,简单阐述一下对?!,?=,?:的理解,知道的大佬就算是温故了,不理解希望能够帮你扫扫盲点。
用一个例子开头吧,我在写bolg的注册部分时,密码要求必须为数字、字母、特殊符号组合,并且长度为8-16位。
长度很好验证,难点是在必须为数字、字母、特殊符号的组合。
哪些是不可行的
1. 纯数字不行
2. 纯字母不行
3. 纯特殊符号不行
4. 数字和字母组合不行
5. 数字和特殊符号组合不行
6. 字母和特殊字符不行
这是高中学的排列组合吧,哈哈哈,言归正传,看看可能用到的正则。如下图所示:
wW
就可以啦
接下来开始写啦,
包含数字、字母、特殊符号的正则
const reg = /[a-zA-Z]+$/
但是这个有一个问题,就是他包含了以上不可行的6种情况,所以还需要把以上的6种情况排除。
1. 纯数字
const reg = /[_W]+$/
2. 纯字母
const reg = /[da-zA-Z]+$/
没毛病吧,嘿嘿
3. 纯特殊符号
const reg = /[d_W]+$/
4. 数字和字母
const reg = /[a-zA-Z_W]+$/
5. 数字和特殊符号
const reg = /[a-zA-Z_W]+$/
6. 字母和特殊符号
const reg = /[a-zA-Z_W]+$/
都写出来了,接下怎么排除呢,这就需要?!上场啦。
先来介绍一波
看看官方文档怎么解释:
是不是有点晕,其实认真看例子的话,还是挺简单的。来个简易版的
x(?=y) 查找y前面的x
// ?=x(?=y) // 查找y前面的x// eg:const reg = /Jack(?=Spart)/;reg.test('JackSpart'); // truereg.test('JackASpart'); // falsereg.test('JackSpartqaass'); // true
x(?!y) 查找后面不是y的x
// ?!x(?!y) // 查找后面不是y的x// eg:const reg = /d+(?!.)/; // 匹配数字reg.exec('3.141'); // 141// 这里是因为3的后面有.,而141后面没有点
(?
// ?
组合之后的正则
const reg = /^(?!d+$)(?![a-zA-Z]+$)(?![_W]+$)(?![da-zA-Z]+$)(?![d_W]+$)(?![a-zA-Z_W]+$)[wW]{8,16}$/
符合需求,完美。
?:
1. () 表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
2. (?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
// eg: 数字格式化 1,123,000"1234567890".replace(/B(?=(?:d{3})+(?!d))/g,",") // 结果:1,234,567,890,匹配的是后面是3*n个数字的非单词边界(B)
最后
算是一个正则表达式的扫盲吧。
以上是自己一个浅显的理解,如有错误,欢迎留言指正。