REGEX 验证不能包含某些字符的密码

REGEX to validate password that can't contain some caracters

我需要检查密码是否符合以下规则:

例如:

我试过这个:

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

满足所有规则,最后一条除外(不能包含“.”或“_”)。正则表达式对我来说总是很痛苦,我不知道该怎么做。

感谢大家!

你的正则表达式是正确的。我会使用:

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

此模式表示:

^
    (?=.*?[A-Z])  assert capital letter
    (?=.*[a-z])   assert lowercase letter
    (?=.*\d)      assert digit
    (?=.*\W)      assert non word/special character
    (?!.*[._])    assert NO dot or underscore
    .{8,}         match a password of length 8 or greater
$

使用像这样的先行 (?=(.*[a-z]){1,}),您可以省略带有量词 {1,} 的组,因为在字符串中断言一次就足够了。

如果您不想匹配 space ._ 您可以使用 negated character class 来匹配 8 次或更多次,但不包括这些字符。

在前瞻断言中也使用否定字符 class 可防止不必要的回溯。

^(?=[^A-Z\r\n]*[A-Z])(?=[^a-z\r\n]*[a-z])(?=[^\d\r\n]*\d)(?=\w*\W)[^\s._]{8,}$

模式匹配:

  • ^ 字符串开头
  • (?=[^A-Z\r\n]*[A-Z]) 断言字符 A-Z
  • (?=[^a-z\r\n]*[a-z]) 断言一个字符 a-z
  • (?=[^\d\r\n]*\d) 断言一个数字
  • (?=\w*\W) 断言一个非单词字符
  • [^\s._]{8,} 匹配任何字符 8 次以上,白色 space 字符 .-
  • $ 字符串结束

Regex demo