匹配正则表达式中的任何四个

时间:2014-04-23 11:17:05

标签: regex

我是正则表达式的新手。 我想验证我的密码,该密码必须包含以下任意三个:

  • 一位数
  • 一个小写字母
  • 一个大写字母
  • 这组字符中的一个特殊字母

    .~^;:?=@#${}|_()*,-
    

如果有任何用户输入一个数字,一个小写字母,一个大写字母和特殊字母不是来自上面的组,即1234S%n&,表达式应该返回false。

我试过以下表达式:

(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).*$|(?=.*\d)(?=.*[A-Z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[+&%<>]).*$|(?=.*\d)(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[&+%<>]).*$|(?=.*[A-Z])(?=.*[a-z])(?=.*[.~^;:?=@#${}|_()*,-])(?!.*[&+%<>]).*$

请帮助我解决我的困惑

1 个答案:

答案 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.~^;:?=@#${}|_()*,-]

强制允许的字符