我需要一个正则表达式来检查:

密码至少包含八个字符,包括至少一个数字,包括小写和大写字母以及特殊字符,例如#、?、!。

它不能是您的旧密码,也不能包含您的用户名、“密码”或“网站名称”

这是我的验证表达式,用于八个字符,包括一个大写字母、一个小写字母和一个数字或特殊字符。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

如果密码必须是八个字符,包括一个大写字母、一个特殊字符和字母数字字符,我怎么写?


当前回答

一个更“通用”的版本(?),不允许任何英文字母作为特殊字符。

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,}$

变量pwdList=['@@V4-\3Z'zTzM{>k',‘12qw!“QW12',123qweASD!"#',“1qA!"#$%&',“Günther32”,'123456789',‘qweASD123’,'qweqQWEQWEqw',“12qwAS!”],re=/^(?=\S*[a-z])(?=[S*[a-z])((?=`S*\d)(?=\S*[^\w\S])\S{8,}$/;pwdList.forEach(函数(pw){document.write('<span style=“color:'+(re.test(pw)?'green':'red')+'”>'+pw+'</span><br/>');});

其他回答

希望以下方法有效。我在Azure自定义策略中尝试了此操作。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!])([A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/`~&quot;();!]|\.(?!@)){6,16}$

我在这里发现了很多问题,所以我自己做了。

这里是它的荣耀,有测试:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([^a-zA-Z\d\s])).{9,}$

https://regex101.com/r/DCRR65/4/tests

需要注意的事项:

不使用\w,因为其中包含我正在测试的_。我在匹配符号时遇到了很多麻烦,但没有匹配行的结尾。没有具体指定符号,这也是因为不同地区的键盘上可能有不同的符号。

保持简单和直接:

这对你来说总是有好处的。

正则表达式:^(.{0,7}|[^a-z]{1,}|[^a-z]{0,}|[^\d]{2,})$|[\s]

如果您的密码与上面的正则表达式匹配,则该密码无效。

如果没有匹配项,则您的密码有效,并且包含至少8个字符、一个大写字母、一个小写字母和一个符号或特殊字符。它也不包含空格、制表符或换行符。

Regex细分

.{0,7}-如果密码包含0到7个字符,则匹配。[^a-z]{1,}-匹配,如果找不到小写[^A-Z]{1,}-如果找不到大写字母,则匹配[^\d]{1,}-如果找不到数字(介于[0-9]之间),则匹配[\s]-如果找到空格、制表符或换行符,则匹配。

使用这种方法,在允许的符号方面没有限制或限制。如果要限制为允许的符号数,只需将[^\W]更改为[^YourSymbols]即可。

演示:

函数password_check(){pass=document.getElementById(“密码”).value;console.log(通过);正则表达式=/^(?=.*[a-z])(?=..*[a-z])((?=*.*\d)(?=.*[@$!%*?&])[a-Za-z\d@$!%*?&]{8,}$/;if(regex.exec(pass)==null){警报('有效密码!')}其他{console.log(“有效”);}}<input type=“text”id=“password”value=“Sample@1"><input type=“button”id=“submit”onclick=“password_check()”value=“submit“>

没有直接回答这个问题,但它真的必须是正则表达式吗?

我曾经做过很多Perl,并习惯于用正则表达式解决问题。然而,当它们变得更加复杂时,你需要编写几十个单元测试来消除所有这些小bug。

此外,正则表达式通常比命令式或函数式解决方案慢几倍。

例如,以下(不是非常FP)Scala函数解决原始问题的速度大约是最流行答案的正则表达式的三倍。它的作用也很清楚,您根本不需要单元测试:

def validatePassword(password: String): Boolean = {
  if (password.length < 8)
    return false

  var lower = false
  var upper = false
  var numbers = false
  var special = false

  password.foreach { c =>
    if (c.isDigit)       numbers = true
    else if (c.isLower)  lower = true
    else if (c.isUpper)  upper = true
    else                 special = true
  }

  lower && upper && numbers && special
}