2 haoyuan2012 haoyuan2012 于 2017.09.15 08:44 提问

至少包括字母数字特殊字符中任意2种的正则表达式 2C

/(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)$)^[\w~!@#$%^&*?]{7,20}$/
这个正则表达式规定了必须包括字母数字特殊字符中任意2种组合,这个表达式是从网上找的,经过测试是可以用的,但是看不懂什么意思,请高手给予解析、指点!

7个回答

caozhy
caozhy   Ds   Rxr 2017.09.15 08:48
 \d+ 数字
a-zA-Z 字母
~!@#$%^&*? 符号
这里是数字、字母或者符号
?! 零宽度断言,匹配但是不占用宽度
这样就匹配了第一种字符
[\w~!@#$%^&*?]{7,20}
这是匹配第二种,并且7~20长度
u011046042
u011046042   2017.09.15 08:53

建议看脚本shell里面的 这些东西 然后自己弄懂比较好

AAAAABBBBBYYYYY
AAAAABBBBBYYYYY   2017.09.15 09:03

\d: 匹配一个数字字符;
\d+:匹配数字字符一次或多次
|:或者 相当于Or
[a-zA-Z]+:匹配字母一次或多次
[~!@#$%^&*?]+:匹配特殊字符一次或多次
(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)$):匹配第一种

\w:匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”
~!@#$%^&*?:匹配特殊字符
{7,20}:最少匹配7次最多匹配20次
^[\w~!@#$%^&*?]{7,20}$:匹配第二种

对着这个慢慢看呗
https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin

qq_26433213
qq_26433213   2017.09.15 09:28

可视化网站%24)%5E%5B%5Cw~!%40%23%24%25%5E%26*%3F%5D%7B7%2C20%7D%24%2F "")


qq_26433213
qq_26433213   2017.09.15 09:29

先看看简单的,然后再来看这个,图形化后看齐来比较直观
图片说明

haoyuan2012
haoyuan2012   2017.09.15 11:06

我可能之前没说清楚,正则的符号我都懂,也看了正则表达式必知必会的书籍,但是组合起来就不太明白了,我是这样分析的,先将表达式拆分为2部分,第一部分:(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)
第二部分:^[\w~!@#$%^&*?]{7,20}$
其中第一部分我试了试,数组字母、数字、特殊字符输入任意一种都可以。
第二部分:也是输入字母数字特殊字符任何一种都可以,只不过长度有要求。
但是两部分组合到一块就是必须至少要字母数字特殊字符任意2种组合,只输入一种就会报错,不明白这个表达式是如何做到的?
请各位老师仔细分解、指导下!

m0_38124502
m0_38124502   2017.09.15 12:12

我先给你举个例子,比如9Asb123456这个密码段。
你用第一部分匹配出来的是9
第二部分匹配了9Asb123456(也就是所有)
为什么这样能实现呢?
原因是这样的:
首先你要求的条件是至少匹配两个不同的字符类型。
也就是说你的第一部分匹配出的9表示第一种字符数字,
这时候就证明你的字符串9后面是其他字符
也就说明了我检查出来9这个数字,就可以确认密码段含有两种类型了,
(不管9后面有多少种类型,它目前已经至少满足是两种类型了)
这时候结合你的第二部分匹配,,检查是否位数足够,检查9后面的是否有非法字符类型,比如空格
就可以证明了9Asb123456是合格的

还有一个问题?
如果我把密码段改成123456789
你的第一部分匹配到的就是123456789整个数字类型,第一部分通过
第二部分匹配的结果也是123456789,这时候满足了位数,并不满足类型
所以你还要有个判断,你的第一部分匹配结果得到的长度不能和第二部分匹配结果得到的长度相同。

Csdn user default icon
上传中...
上传图片
插入图片