Javascript正则表达式扫盲


Javascript正则表达式扫盲


前言

正则表达式应用太广泛了,遍布于各端程序猿日常编码中。

这里只是做学习补充,简单阐述一下对?!,?=,?:的理解,知道的大佬就算是温故了,不理解希望能够帮你扫扫盲点。

用一个例子开头吧,我在写bolg的注册部分时,密码要求必须为数字、字母、特殊符号组合,并且长度为8-16位。

长度很好验证,难点是在必须为数字、字母、特殊符号的组合。

哪些是不可行的

1. 纯数字不行

2. 纯字母不行

3. 纯特殊符号不行

4. 数字和字母组合不行

5. 数字和特殊符号组合不行

6. 字母和特殊字符不行

这是高中学的排列组合吧,哈哈哈,言归正传,看看可能用到的正则。如下图所示:

Javascript正则表达式扫盲

\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]+$/

都写出来了,接下怎么排除呢,这就需要?!上场啦。

先来介绍一波

看看官方文档怎么解释:

Javascript正则表达式扫盲

是不是有点晕,其实认真看例子的话,还是挺简单的。来个简易版的

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)

最后

算是一个正则表达式的扫盲吧。

以上是自己一个浅显的理解,如有错误,欢迎留言指正。

您可能还会对下面的文章感兴趣: