看网上的正则,有一条没看懂

来源:5-1 课程总结

WittChen

2020-05-11 07:19:00

/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,31}$/

老师您好,这句话是什么意思呀。

?= 我记得课程上讲过是前瞻性匹配

写回答

3回答

好帮手慕久久

2020-05-11

同学你好,(?=正则表达式)是前瞻匹配,实际匹配的是它所修饰的内容,而不是它本身,如下:

http://img.mukewang.com/climg/5eb93111093933ec21020247.jpg

该例子中,匹配的是字符”java”,但并不是所有“java”都能被匹配,只有后面是“script”的“java”才能被匹配到。对应我们这个正则,需要匹配的是[0-9A-Za-z]{6,10},条件是三个括号中的内容。

具体含义如下:

三个括号:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]) 是条件,其中:(?=.*[A-Z])的意思是匹配的字符串需要包含”.*”和A-Z;(?=.*[a-z])意思是匹配的字符需要包含”.*”和a-z;(?=.*[0-9])意思是匹配的字符需要包含”.*”和0-9;而”.*”意思是除了换行符之外的所有字符0个到多个。

这三个括号都是修饰”[0-9A-Za-z]{6,10}”这句正则,最终匹配的也是这句正则,并且这句正则还需要满足三个括号中的条件。由于”[0-9A-Za-z]{6,10}”中限制了字符种类是数字、大写字母或者小写字母,所以三个条件中的”.*”中的*就只能是0次,所以第一个括号就变成了需要包含大写字母,第二个括号变成了需要包含小写字母,第三个括号变成了需要包含数字。


1
hittChen
h 谢谢老师耐心解答,看到“实际匹配的是它所修饰的内容,而不是它本身”,突然间恍然大悟
h020-05-11
共1条回复

好帮手慕久久

2020-05-11

同学你好,该条正则的主体部分是:/^[a-zA-Z0-9]{8,31}$/,使用了首尾匹配,即首尾之间是8-31位字母和数字,不包含符号,非字母、非数字字符,所以条件中的“.*”就只能是0个“.”。

0
hittChen
h 首部明明匹配的是(?=.*[A-Z]),怎么就省略了呢
h020-05-11
共3条回复

好帮手慕久久

2020-05-11

同学你好,”?=“是 前瞻性匹配;该段正则的意思是匹配8-31位包含a-zA-Z0-9的字符,并且必须包含A-Z、a-z、0-9三种字符。如下:

http://img.mukewang.com/climg/5eb8e9b9091964a015180116.jpg

如果我的回答帮到了你,欢迎采纳,祝学习愉快!

0
hittChen
h /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,31}$/ “ . ”表示除了换行符都匹配,后面加了* 表示任意个可以是零个,那为什么是匹配8-31位包含a-zA-Z0-9的字符,并且必须包含A-Z、a-z、0-9三种字符,不明白呀
h020-05-11
共2条回复

0 学习 · 14456 问题

查看课程