Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 密码强-不需要每个条件_Regex - Fatal编程技术网

Regex 密码强-不需要每个条件

Regex 密码强-不需要每个条件,regex,Regex,我已通过正则表达式进行密码验证。这是我的表达式: ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 它可以工作-密码必须包含至少1个数字、至少1个小写字母、至少1个大写字母和至少一个特殊字符:@$%^&+=。所以我必须输入所有这些字符 但我希望密码至少有3个组合,而不是全部4个组合。 因此,这些密码应该是好的: 2Df(非特殊字符)、dF#(非数字)、a4%(非大写)。我想问,这个正则表达式应该是什么样子?我可以编写每个表达式来检

我已通过正则表达式进行密码验证。这是我的表达式:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$  
它可以工作-密码必须包含至少1个数字、至少1个小写字母、至少1个大写字母和至少一个特殊字符:
@$%^&+=
。所以我必须输入所有这些字符

但我希望密码至少有3个组合,而不是全部4个组合。
因此,这些密码应该是好的:

2Df
(非特殊字符)、
dF#
(非数字)、
a4%
(非大写)。我想问,这个正则表达式应该是什么样子?我可以编写每个表达式来检查每个组合,例如:

  • 不包括数字:
    ^(?=.[a-z])(?=.[a-z])(?=.[@$%^&+])。$
  • 不包括大写:
    ^(?=.*\d)(?=.[a-z])(?=.[@$%^&+=])。$

但也许我可以用一个表达式来实现它。

为什么要用正则表达式呢?只需迭代您的密码字符串并计算所需字符类型的数量。在PHP中,可以使用类似于
count\u chars()
的函数

这方面的伪代码:

      foreach(password as char) {
        if (is_digit(char))
           digits++;
        if (is_specialchar(char))
           special++;
        if (is_lower(char))
           lower++;
        if (is_upper(char))
           upper++;
        //etc
      }
现在,您可以定义您想要的任何需求

      if (dgits > 0) and (lower > 0) and (special > 0)
         passowrd_ok()
      else
         password_bad()
在你的情况下,你可以聪明地数数

     if (lower > 0)
        diversity++;
     if (upper > 0)
        diversity++;
     if (special > 0)
        diversity++;
     if (digit > 0)
        diversity++;

     if (diversity >= 3)   //at least 3 different types of characters in password
        pass_ok()

如果必须使用正则表达式,我建议(为了清楚起见)逐个检查所有四个条件。为了便于阅读,您可以首先尝试在密码中查找
\d
,然后查找
[a-z]
,然后查找
[a-z]
,然后再查找
[@$%^&+=]
(尽管您可能希望使用
[\W\u]
来允许更多的字符)。然后检查其中是否至少有三个有效

如果必须在单个正则表达式中执行此操作,则可以使用交替:

^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])|(?=.*[\W_])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[\W_])(?=.*\d)).*$

但这太难看了。

你用哪种语言做这件事?谢谢你的回答。我必须在ASP(而不是.NET)站点上验证密码,所以我认为,最好的解决方案是正则表达式。@luk4443:为什么?您可以在VB、C#或其他语言中对字符串进行迭代。在VB中,对于i=0到s.Length-1,循环是
,可以通过
s.Chars(i)
Mid(s,i,1)
@luk443访问每个字符:也看看这里,有一个与此相关的问题