使用正则表达式进行复杂密码验证

Muc*_*low 0 javascript regex

我正在尝试为密码验证创建一个javascript正则表达式.接受密码的规则是

  • 应包含12个字符或更多
  • 应该包含这些特殊字符之一 * ^ !
  • 至少两个大写字符
  • 至少两个数字
  • 至少一个小写字符

我在网上找到了一个例子并将其修改如下

(?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,}
Run Code Online (Sandbox Code Playgroud)

但是,这仍然会忽略特殊字符要求,并且只有在大写字符和数字按后续顺序排列时才有效.这些是我用这个得到的结果

aMMericano11 - true
aMmeRican1o1 - false
Run Code Online (Sandbox Code Playgroud)

我希望第二个也被接受,当然还增加了特殊字符.

谁可以帮我这个事?

Nie*_*sol 6

无视我对任意密码规则徒劳无益的讽刺评论,你试图立即做太多.

你正在做的是"它有12个字母或更多,一个符号*^!和至少两个大写字母和至少两个数字和至少一个小写字母"......

你应该做的是:

  • 它有12个字母还是更多?如果没有,请失败并要求更长的密码
  • 它有符号吗?如果没有,请失败并要求提供符号
  • 它至少有两个大写字母吗?如果没有,失败并要求他们.
  • 它至少有两个数字吗?如果没有,失败并要求他们.
  • 它至少有一个小写字母吗?如果没有,失败并要求它.

将大问题分解为小问题,最终会获得更好的用户体验,因为您可以准确地告诉用户他们想要的内容.


drf*_*drf 5

问题在于前瞻:

(?=.*[0-9]{2,})
Run Code Online (Sandbox Code Playgroud)

该模式要求图案[0-9]{2,}(例如,2位数字)出现在文本中.你可能想要的是:

(?=(.*[0-9]){2,})
Run Code Online (Sandbox Code Playgroud)

这允许数字由其他字符分隔,而不是连续.

同样的问题适用于大写字母规则.拼凑这个,最后的表达式将是:

(?=(.*[0-9]){2,})(?=.*[\*^!])(?=.*[a-z])(?=(.*[A-Z]){2,}).{12,}
Run Code Online (Sandbox Code Playgroud)

当且仅当密码符合有效性规则时,表达式才匹配.如果需要更多粒度(例如,为了检测违反特定规则),您可能需要将表达式分解为更小的表达式.