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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
正则表达式:大写字母 小写字母 数字 特殊字符(四种里至少三种)
(((?=.*[a-z])+(?=.*[A-Z])+(?=.*\d)+)|((?=.*[A-Z])+(?=.*[a-z])+(?=.*[`~!@#$%^&*()+={}':;',.?~!@#¥%……&*()——+{}【】‘;:”“’。,、?\|\[\]])+)|((?=.*\d)+(?=.*[a-z])+(?=.*[`~!@#$%^&*()+={}':;',.?~!@#¥%……&*()——+{}【
密码等级:至少包含字母、大小写数字、字符中的两种 JS实现方案
前言 密码,如果设置的太简单,很容易就被攻破,所以很多网站将密码设置的要求设置的挺严格,一般是字母、数字、字符3选2,区分大小写。对于设置得太简单的密码,予以错误提示。或者予以密码等级(低中高)显示,让用户设置高级密码。那如何利用JS实现呢? 代码 链接:https://gist.github.com/xuanfeng/a44f20cb4569d5b4cd5e 1234
正则表达式验证由数字,大写字母,小写字母,特殊符,至少其中三种组成密码
公司项目突然要求密码强度,设置密码必须符合由数字,大写字母,小写字母,特殊符,至少其中三种组成密码,子移动端需要验证,之前也没深入研究过正则表达式,在网上找了好多也没有相符合的,就花了点时间自己总结了一套,我在这里分享出来,希望对大家有帮助 ^(?![A-Za-z]+$)(?![A-Z\\d]+$)(?![A-Z\\W]+$)(?![a-z\\d]+$)(?![a-z\\W]+$)(?![\\d
正则表达式字母数字特殊符号至少两种(文件后缀名丢失,下载后需自行修改为xxx.rar格式后解压使用)
(文件后缀名丢失,下载后需自行修改为xxx.rar格式后解压使用)正则表达式包含字母数字特殊符号(不包含空格)至少两种
判断密码至少8位包含大小写字母,数字,特殊符号四选三
function validatePassWord(pwd){ /* var zhenze=new RegExp("^(?![a-zA-Z]+$)(?![a-z\d]+$)(?![a-z!@#\$%]+$)(?![A-Z\d]+$)(?![A-Z!@#\$%]+$)(?![\d!@#\$%]+$)[a-zA-Z\d!@#\$%]+$"); if(zhenze.test(pwd)){ ret...
正则表达式之密码效验(检验密码是含有小写字母、大写字母、数字、特殊符号的两种及以上)
背景: 公司的新项目需要做一个注册功能,涉及到密码匹配。规则为密码含有小写字母、大写字母、数字、特殊符号的两种及以上。 答案: 采用正则表达式如下: ^(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)\S{6,16}$ 解析:
正则表达式验证六位数以上数字,符号,字母任意两种混合的密码验证策略
正则表达式验证六位数以上数字,符号,字母任意两种混合的密码验证策略 ^(?![0-9]+$)(?![a-zA-Z]+$)(?!([^(0-9a-zA-Z)]|[\(\)])+$)([^(0-9a-zA-Z)]|[\(\)]|[a-zA-Z]|[0-9]){6,}$ 这个正则如果是单独的数字,字符和符号,是不能通过的,少于6位也不行,希望大家可以继续验证正确性吧 积累小
java正则表达式,大写字母、小写字母、特殊字符、数字 两种两种以上组合匹配
package test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class zhengze { /** * @param args */ public static void main(String[] args) { String str="```#$%^!!";
密码长度6位以上且须包含大写、小写、数字、特殊符号中的任意3种
无标题文档 /** * * * *这样的正则貌似最好用多条吧,一条的话不但写起来困难,你反馈给页面提示也不容易,所以我给你写一段验证代码,你来参考一下如何? *如果你非要用一条正则,这正则实在是很难写,而且在JS里,还不支持正则预判,难度更高 *下面是实现的代码,你只要修改一下就可以直接拿去用了。 * * * **/ function testPass(str){ var rC =
js正则表达式验证密码强度,必须包含数字,大写字母,小写字母,特殊字符四选三
验证数字,大写字母,小写字母,特殊字符四选三组成的密码强度,且长度在8到30个数之间 表达式:^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`