我是正则表达式的新手。 我想验证我的密码,该密码必须包含以下任意三个:
这组字符中的一个特殊字母
.~^;:?=@#${}|_()*,-
如果有任何用户输入一个数字,一个小写字母,一个大写字母和特殊字母不是来自上面的组,即1234S%n&
,表达式应该返回false。
我试过以下表达式:
(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).*$|(?=.*\d)(?=.*[A-Z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[+&%<>]).*$|(?=.*\d)(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[&+%<>]).*$|(?=.*[A-Z])(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[&+%<>]).*$
请帮助我解决我的困惑
答案 0 :(得分:2)
匹配&#34;至少n个标准,以下任何一个&#34;在一个正则表达式中不是很容易做到的。
我建议不要这样做,并且分多步执行(快速和简单的伪代码):
password = "1234S%x"
i = 0
// only allowed characters are in the string
char_validated = password.find("^[a-zA-Z0-9.~^;:?=@#${}|_()*,-]+$")
if password.find("[0-9]") then i++ // check for at least one digit
if password.find("[a-z]") then i++ // check for at least one lowercase
if password.find("[A-Z]") then i++ // check for at least one uppercase
if password.find("[.~^;:?=@#${}|_()*,-]") then i++ // check for at least one special
if (i>=3 && char_validated) then ok
如果真的需要在一个正则表达式中执行此操作,您可以使用重构的不易上手的正则表达式:
^(?:(?=.*\d)(?:(?=.*[A-Z])(?=.*[a-z])|(?=.*[A-Z])(?=.*[.~^;:?=@#${}|_()*,-])|(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-]))|(?=.*[A-Z])(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-]))[a-zA-Z0-9.~^;:?=@#${}|_()*,-]+$
请参阅demo here。
我们的想法是,在使用前瞻检查后,不要允许任何内容,强制使用[a-zA-Z0-9.~^;:?=@#${}|_()*,-]