Javascript正则表达式扫盲
前言
正则表达式应用太广泛了,遍布于各端程序猿日常编码中。
这里只是做学习补充,简单阐述一下对?!,?=,?:的理解,知道的大佬就算是温故了,不理解希望能够帮你扫扫盲点。
用一个例子开头吧,我在写bolg的注册部分时,密码要求必须为数字、字母、特殊符号组合,并且长度为8-16位。
长度很好验证,难点是在必须为数字、字母、特殊符号的组合。
哪些是不可行的
1. 纯数字不行
2. 纯字母不行
3. 纯特殊符号不行
4. 数字和字母组合不行
5. 数字和特殊符号组合不行
6. 字母和特殊字符不行
这是高中学的排列组合吧,哈哈哈,言归正传,看看可能用到的正则。如下图所示:
\w\W
就可以啦
接下来开始写啦,
包含数字、字母、特殊符号的正则
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'); // true
reg.test('JackASpart'); // false
reg.test('JackSpartqaass'); // true
x(?!y) 查找后面不是y的x
// ?!x(?!y) // 查找后面不是y的x
// eg:
const reg = /\d+(?!\.)/; // 匹配数字
reg.exec('3.141'); // 141// 这里是因为3的后面有.,而141后面没有点
(?<!y)x 查找前面不是y的x
// ?<!(?<!y)x // 查找前面不是y的x
// eg:
const reg = /(?<!-)\d+/; // 匹配数字
reg.test('3'); // true
reg.test('-3'); // false
组合之后的正则
const reg = /^(?!\d+$)(?![a-zA-Z]+$)(?![_\W]+$)(?![\da-zA-Z]+$)(?![\d_\W]+$)(?![a-zA-Z_\W]+$)[\w\W]{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)
最后
算是一个正则表达式的扫盲吧。
以上是自己一个浅显的理解,如有错误,欢迎留言指正。