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

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

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

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

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

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


当前回答

使用此正则表达式,满足所有条件:

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^A-Za-z0-9]).{8,}$

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

至少一个大写字母(?=.*?[A-Z])至少一个小写字母(?=.*?[a-z])至少一个数字,(?=.*?[0-9])至少一个特殊字符,即前3个条件中不包含的任何字符,(?=.*?[^A-Za-z0-9])长度至少为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
}

另一种选择是使用否定字符类在前瞻断言中使用对比度,可以选择匹配任何字符,但在匹配应该匹配的字符之前列出的字符除外。

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

查看正则表达式演示

在部分情况下,模式匹配:

^字符串的开头(?=[^A-Z\n]*[A-Z])正向前瞻,断言除A-Z或换行外的任何字符的0+倍。然后匹配字符a-Z(?=[^a-z\n]*[a-z])字符a-z的方法相同(?=[^0-9\n]*[0-9])数字0-9的方法相同(?=[^#?!@$%^&*\n-]*[#?!@$%^&*-])对于您认为特殊的字符,使用相同的方法.{8,}匹配除换行符以外的任何字符的8倍或更多倍$字符串结尾

笔记

点也可以与空格匹配。如果您不想允许匹配空间,那么。{8,}可以更改为\S{8}以匹配8个或更多非空白字符使用任意一种。或/S可以匹配比前瞻断言中指定的字符更多的字符。如果只想匹配断言中使用的字符,可以进行更改。{8,}使用字符类仅匹配允许的字符[#?!@$%^&*A-Za-z0-9-]{8、}

常量正则表达式=/^(?=[^A-Z\n]*[A-Z])(?=[^A-Z\n]*[A-Z])((?=[^0-9\n]*[0-9])(!=[^#?!@$%^&*\n-]*[#?!@$%^&*-])。{8,}$/;[“abcA1#!A”,“#!asdfSFD1;”,“#a f F1;”,"1111111111",“aaaaaaa”,"11111111",“aaaaaaa”,"########",“aA1#”].对于每个(s=>console.log(正则表达式测试)`匹配-->${s}`:`不匹配-->$}`));

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

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

此模式用于JAVA编程。

我们可以通过使用HTML5来做到这一点。

在模式属性中使用以下代码,

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

它将完美地工作。

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

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