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

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

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

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

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

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


当前回答

在Java/Android中,用至少一个数字、一个字母和一个特殊字符按以下模式测试密码:

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

其他回答

@ClasG已经建议:

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

但它不接受_(下划线)作为特殊字符(例如Aa12345_)。

一个改进的方法是:

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

对@anubhava的回答只是一个小小的改进:由于特殊字符仅限于键盘中的字符,因此对任何特殊字符都使用此选项:

^(?=.*?[A-Z])(?=(.*[A-Z]){1,})(?(.*[\d]){1,})(?=(.*[\W]){0,}(?!.*\s)。{8,}$

此正则表达式将强制执行以下规则:

至少一个大写英文字母至少一个小写英文字母至少一个数字至少一个特殊字符长度至少为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
}

图案至少匹配1个大写字符、1个数字和任何特殊字符,长度在8到63之间。

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

此模式用于JAVA编程。

正则表达式没有AND运算符,因此很难编写与有效密码匹配的正则表达式,因为有效性是由“AND”或“AND”定义的。。。

但是,正则表达式确实有一个OR运算符,所以只需应用DeMorgan定理,并编写一个匹配无效密码的正则表达式:

任何少于八个字符的东西,任何没有数字的东西,或者任何没有大写字母的东西,或任何没有小写字母的东西或者任何没有特殊字符的东西。

So:

^(.{0,7}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9]*)$

如果有任何内容与此匹配,则是无效密码。