如何编写正则表达式以将密码与规则匹配

How to write regex to match password with rules

我正在尝试编写正则表达式以将密码与以下规则匹配

最小长度 - 8 个字符,如果它包含一个数字和一个小写字母或 15 个字符与任意字符组合

这是我的正则表达式

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

预期结果: 2232ddds - 正确 ddds2222 - 正确

实际结果: 2232ddds - 正确 ddds2222 - 不正确

你能帮我找出问题吗?

问题有两个:

  • 锚点只会影响他们旁边的选择
  • (?=.*\d[a-z])前瞻只要求一个数字和一个小写字母按此顺序出现,如果先是字母再是数字,则无效。

您可以使用

/^(?:(?=.*\d)(?=.*[a-z]).{8,}|[a-zA-Z0-9]{15,})$/
  ^^^|-----------------|     ^                ^  

参见regex demo

如果您想提高效率并遵循最佳实践,请使用

/^(?:(?=\D*\d)(?=[^a-z]*[a-z]).{8,}|[a-zA-Z0-9]{15,})$/

详情

  • ^ - 字符串开头
  • (?: - 非捕获组开始
    • (?=\D*\d) - 至少 1 位数
    • (?=[^a-z]*[a-z]) - 至少 1 个小写字母
    • .{8,} - 除换行符以外的任何 8 个或更多字符
  • | - 或者
    • [a-zA-Z0-9]{15,} - 仅限 15 个或更多字母数字字符
  • ) - 非捕获组结束
  • $ - 字符串结尾。

您可以选择以下几个选项来构建您的正则表达式:

字符串至少包含一个:

  • 小写(?=.*[a-z])
  • 大写 (?=.*[A-Z])
  • 数字(?=.*\d)
  • 符号(?=.[!@#$%\^&])

字符串的最小字符数:(?=.{8,})

您的正则表达式为:(?=.*[a-z])(?=.*\d)(?=.{8,})|(?=.{15,})

希望对您有所帮助!