正则表达式是一个帮助处理和匹配复杂字符串的工具,regular expression(RegEx)
特点:
- 灵活,逻辑性和功能性非常强
- 可以迅速用极简单的方式做到字符串的复杂控制
- 对初学者不友好,比较晦涩难懂
常见用法:
- 邮箱验证
- 密码强度验证
- 身份证号验证
- 用户名验证
- 提取数字
字符集合[]
集合set是一对方括号[]内的一组字符,用来代表整个字符中的任意一个 例如:
[abc]
指定字符(a,b或c)之一[a-z]
表示任何一个小写字母[^abc]
^ 表示否的意思,表达了除a,b,c外的任意字符[0246]
代表 0,2,4,6的任意一个[0-9]
代表 0到9的任意一个数字[a-zA-Z]
任何一个大小写字母[+]
在集合中 +、*、|、()、$、{}都没有特殊含义,仅代表普通字符匹配[0-9]+
这里的加代表连续多个
常见通配符(核心)
通配符是一种特殊字符,一般指的是反斜杠\后面紧跟的一些特殊标识符,用来指代某些字符集合
-
\d
代表阿拉伯数字(只能匹配一个字符) -
\D
代表除了阿拉伯数字外的所有字符,可以理解为[^\d] -
\s
空白字符 -
\S
除空白字符外的所有字符 -
\w
任何单词字符(字母、数字、汉字、下划线_字符) -
\W
返回一个匹配项,其中字符串不包含任何单词字符 不常用: -
\A
字符串的开头 -
\Z
字符串的末尾 -
\b
返回指定字符位于单词的开头或者末尾的匹配项 -
\B
不在单词的开头和结尾处
元字符(复杂重要)
在正则表达式中具有特殊含义的字符,具有很高的优先级。例如[]
、\
、+
都是元字符 在元字符中\
的优先级最高,其次为各种括号
-
\
代表对随后的通配符进行转义,因此需要用\\
表示\
本身
若反斜杠后面没有通配符,则反斜杠原样输出,就不再转义
-
[]
用于限定字符集合
注意:使用
[]
时,再[]中间的特殊字符如.+?*:-等等都是看作普通字符,但若要将\[]看作普通字符,需要进行转义,即使用\\表示\,使用\[来表示[
[\w,]+
//代表检索所有连续的单词字符或者连续的, 在[]中只能匹配一个字符
-
.
英文的小数点,表示除换行符之外的任何一个字符 -
*
代表前面的字符可以出现0次或多次 -
+
代表一个或多个连续匹配的字符 -
?
非贪婪模式,表示匹配前面的字符0次或一次 -
+?
将搜索模式从贪婪模式改为非贪婪模式如果能匹配到,则匹配一个,不会匹配多个
-
{}
表示的是前面表达式的确切的出现次数\d{2} 表示 匹配两个数字 \d{2,4} 表示 匹配2-4个数字,2,3,4个 \d{2,} 表示2位到无限位
-
|
管道符 代表选择其中一个,一般按顺序选择,若前面的已被匹配,就不会匹配后面的 -
()
捕获和分组括号内的字符串将会作为捕获的结果进行输出,只会输出括号内的匹配字符串
-
^
代表字符串的开始 -
代表字符串的结束
-
?:
表示非捕获分组,匹配冒号后的内容抄但不获取匹配结果,不进行存储供以后使用。
使用捕获组
let str = "abcc123dd1hg";
const regex = /(\d+)([a-zA-Z]+)/g
regex.exec(str);
console.log(`${RegExp.$1}----${RegExp.$2}---${RegExp.$0}`); //获取捕获组中捕获的内容
//123----dd---undefined
密码强度验证
使用正则表达式来进行密码强度验证,一般密码由数字、字母和特殊字符组成,若由一连串的数字或字母或特殊字符,这种密码的安全性不高,而由其中两种组成密码强度一般,用户密码包含的字符种类越多,密码的安全性越高
- 只有数字验证(安全性较低)(六位以上的数字密码)
\d{6,}
- 只有字母验证(六位以上的字母密码)
[a-zA-Z]{6,}
- 只有特殊字符的密码(六位以上的特殊字符密码)
[.-+?\\\[\]`/;'@#$%^&*():<>=~]{6,}
注意:在集合中写[]和\时需要进行转义,因为这两个时元字符,优先级较[]来说更高
解释:
[\da-zA-Z]* 表示匹配空字符串,或长度至少为1的由数字和字母组成的字符串 \d+[a-zA-Z]+ 表示1个或多个连续数字和1个或多个连续字母组成的字符串 连起来就可以匹配一系列数字和字母组成的字符串
- 数字与字母混合使用密码
[\da-zA-Z]*\d+[a-zA-Z]+[\da-zA-Z]*
- 数字和特殊字符串混合使用
[\d.-+?\\\[\]`/;'@#$%^&*():<>=~]*\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+[\d.-+?\\\[\]`/;'@#$%^&*():<>=~]*
- 三种字符混合使用(密码强度比较高)
[\da-zA-Z.-+?\\\[\]`/;'@#$%^&*():<>=~]* #0个或多个数字、字母和特殊字符的混合字符串
((\d+[a-zA-Z]+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+)| #数字开头
(\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+[a-zA-Z]+)| #数字开头
([a-zA-Z]+\d+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+)| #字母开头
([a-zA-Z]+[.-+?\\\[\]`/;'@#$%^&*():<>=~]+\d+)| #字母开头
([.-+?\\\[\]`/;'@#$%^&*():<>=~]+\d+[a-zA-Z]+)| #特殊字符开头
([.-+?\\\[\]`/;'@#$%^&*():<>=~]+[a-zA-Z]+\d+)| #特殊字符开头
)[\da-zA-Z.-+?\\\[\]`/;'@#$%^&*():<>=~]*
邮箱验证
一般邮箱在@前面会是数字和字母的混合,在其中间可能会混有_
、-
、.
、+
,在@后面可能会带有字母和数字然后.加上*域名或者会有两个域名
^[\da-zA-Z.-_+]+@[\da-zA-Z_.-+]+[.][\da-zA-Z]{2,4}$
注意:想表示字符.时一定要加上[.],因为普通的.代表的是任意字符,而[.]代表的是字符.
身份证号验证
身份证号由六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码组成
- 地址码规则 以数字1-9开始,剩下的5位数字为0-9
[1-9]\d{5}
- 年份码规则 年份码为4位,按现实情况来说现在只有18、19、20开头的
(18|19|20)\d{2}
- 月份码规则 由两位数字组成,第一位若为0,则第二位是1-9;第一位若为1,则第二位为0、1或2 (0[1-9])|(1[0-2])
- 日期码规则 若第一位取1-2,第二位可以取0-9;若第一位取0,则第二位取1-9,若第一位取3,则第二位可以取0-1
([1-2][0-9])|(0[1-9])|(3[0-1])
- 顺序码规则 顺序码为三位
\d{3}
- 校验码规则 校验码长一位,可以是数字可以是X或者x
[\dXx]
- 总结
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([1-2][0-9])|(0[1-9])|(3[0-1]))\d{3}[\dXx]$
去掉头尾空白字符
reg = /^\s+|\s+$/g;