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

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

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

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

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

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


当前回答

我在前面的一个答案中找到了一个解决方案:

*至少8个字符,至少1个大写字母、1个小写字母、1位数字和1个特殊字符:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}"*

…不适用于我,但以下是一个简化版,效果很好(添加任何您喜欢的特殊字符,我在这里添加了#),并添加数字规则,就像您对字母的处理一样:

"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]){8,}"

其他回答

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

我曾经做过很多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
}

演示:

函数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“>

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

联机链接检查https://regex101.com/r/mqGurh/1

我会回复彼得·莫滕森,但我没有足够的声誉。

他的表达完全符合每一项规定的最低要求。他的表达式不需要特殊字符的问题是,它们也不允许特殊字符,所以它们也强制执行最大要求,我不相信OP要求的。通常情况下,您希望允许您的用户将密码设置为他们想要的强度;为什么要限制强密码?

因此,他的“最少八个字符,至少一个字母和一个数字”表达:

^(?=.*[A-Za-z])(?=..*\d)[A-Za-z\d]{8,}$

达到了最低要求,但剩余的字符只能是字母和数字。要允许(但不要求)特殊字符,您应该使用以下内容:

^(?=.*[A-Za-z])(?=.*\d).{8,}$以允许任何字符

or

^(?=.*[A-Za-z])(?=..*\d)[A-Za-z \d$@$!%*#?&]{8,}$允许特定的特殊字符

同样,“最少八个字符,至少一个大写字母,一个小写字母和一个数字:”

^(?=.*[a-z])(?=..*[a-z])((?=*.*\d)[a-zA-z\d]{8,}$

满足最低要求,但只允许字母和数字。使用:

^(?=.*[a-z])(?=.*[a-z])(“?=.*\d).{8,}$允许任何字符

or

^(?=.*[a-z])(?=..*[a-z])((?=.*\d)[a-Za-z\d$@$!%*?&]{8,}以允许特定的特殊字符。

您可以使用下面的正则表达式模式检查密码是否符合您的期望。

((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()]).{8,20})