正则表达式不起作用 - 最少 1 个大写字母、最少 3 个小写字母、最少 1 个来自定义组的特殊字符(更多描述)

Regex not working - minimum 1 uppercase, minimum 3 lowercase, minimum 1 special character from the defined group (more in description)

我需要根据以下要求创建一个正则表达式:密码至少需要 8 个字符,最多 12 个字符,至少 1 个大写字母,至少 3 个小写字母,至少 1 个数字和至少 1 个特殊字符来自组 (#*.!?$),不带括号。第一个字符需要是大写或小写字母。密码中不能连续出现两个相同的字符。 我做了这个,但它不起作用:

^(?=.{8,12}$)(([a-z]|[A-Z])(?=.*\d){1,}(?=.*[a-z]){3,}(?=.*[A-Z]){1,}(?=.*[!.?*$#])?(?!))+$

我尝试用 Abcd123! 测试它,但它不起作用。任何人都可以解释我在哪里犯了错误,我在这里做了什么?

您使用 {1,} 之类的量词进行前瞻,这是不正确的。

我想你是想像这样使用前瞻:

^(?=.{8,12}$)(?=[^A-Z]*[A-Z])(?=\D*\d)(?=(?:[^a-z]*[a-z]){3})(?=[^\s#*.!?$]*[#*.!?$])(?!.*(.))(?:[a-z]|[A-Z])[a-zA-Z0-9#*.!?$,]+$

关于图案

  • ^ 字符串开头
  • (?=.{8,12}$) 断言长度 8 - 12
  • (?=[^A-Z]*[A-Z]) 断言大写字符
  • (?=\D*\d) 断言数字
  • (?=(?:[^a-z]*[a-z]){3}) 断言 3 个小写字符
  • (?=[^\s#*.!?$]*[#*.!?$]) 断言特殊字符
  • (?!.*(.)) 断言不是 2 个连续的字符
  • (?:[a-z]|[A-Z]) 以大写或小写字符开头
  • [a-zA-Z0-9#*.!?$,]+ 匹配 1+ 次字符 class
  • 中列出的任何一个
  • $ 断言字符串结束

Regex demo | Php demo