确保给定字符串与以下内容匹配的正则表达式是什么? 条件?
最少八个字符的长度。
应该是以下三项的组合:
a. Upper case characters
b. Lower Case characters
c. Numbers
d. Special characters `(!@#$%^&*?/)`
我知道一个正则表达式可以帮助我检查字符串是否匹配#2下提到的所有点。但我想知道我们如何检查组合?
正在使用的正则表达式:
^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.(_|[!@#$%^&*?/])).{8,}$
先谢谢
答案 0 :(得分:3)
您希望在前瞻中使用.*
代替.
例如:(?=.*[a-z])
而不是(?=.[a-z])
<强>解释强>
.
只匹配任何字符的一个,所以目前,您的前瞻只检查第二个字符是否匹配[a-z]
,[A-Z]
,\d
或[_|[!@#$%^&*?/]
。
但是不要这样做,因为即使你正确实施它,这也是一个可怕的密码策略。
这些密码策略适用于那些不太了解如何创建强密码的人。密码破解者不会以任何方式将大写字母或$
视为“特殊”。执行此类操作只会使人们更难记住密码。您可以更好地教育您的用户如何创建强密码。
实现这一点也非常简单。不需要正则表达式!
if (password.length < 16) { /* too short! */ }
如果你不相信,也许这部着名的漫画会有所帮助
(信用:http://xkcd.com/936/)
答案 1 :(得分:0)
你几乎就在那里,只是在正则表达式中不匹配.
(任何字符):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[_!@#$%^&*?/])[\w!@#$%^&*?/]{8,}$
\w
与[a-zA-Z0-9_]
答案 2 :(得分:0)
不幸的是,您使用的是不支持正则表达式条件的JavaScript。
在一个正则表达式中,只有两种方法可以完成 1.对Y 的 X进行所有排列 2.使用支持条件的引擎。
由于JavaScript无法解决问题,因此只剩下1.左 当它超过订单3时我感到困惑。
如果发动机支持条件,就可以这样做 但它没有,所以忽略这一点。
作为参考,如果你可以使用条件,那么任何X的Y都很容易完成 检查捕获组的输出匹配位置,并注意如何 他们出了故障。
示例:
# ^(?:.*?(?:((?(1)(?!))[a-z]+)|((?(2)(?!))[A-Z]+)|((?(3)(?!))[0-9]+)|((?(4)(?!))[_!@#$%^&*?/]+))){3,4}.*$
^
(?:
.*?
(?:
( # (1)
(?(1)
(?!)
)
[a-z]+
)
| ( # (2)
(?(2)
(?!)
)
[A-Z]+
)
| ( # (3)
(?(3)
(?!)
)
[0-9]+
)
| ( # (4)
(?(4)
(?!)
)
[_!@#$%^&*?/]+
)
)
){3,4}
.*
$
输出:
** Grp 0 - ( pos 0 , len 15 )
B,B_+&*%#a0AaaP
** Grp 1 - ( pos 9 , len 1 )
a
** Grp 2 - ( pos 0 , len 1 )
B
** Grp 3 - ( pos 10 , len 1 )
0
** Grp 4 - ( pos 3 , len 1 )
_