正则表达式验证不能包含某些字符的密码

Posted

技术标签:

【中文标题】正则表达式验证不能包含某些字符的密码【英文标题】:REGEX to validate password that can't contain some caracters 【发布时间】:2022-01-17 12:55:53 【问题描述】:

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

至少 8 个字符(长度) 一个大写字母 一个小写字母 一个号码 一个特殊字符 不能包含“.”或“_”(棘手的部分)

例如:

Bft$ns2E => 应该匹配 H2od%^.,3 => 不应该匹配(注意“.”)

我试过了:

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

满足所有规则,除了最后一条(不能包含“.”或“_”)。正则表达式对我来说总是很痛苦,无法弄清楚如何做到这一点。

谢谢大家!

【问题讨论】:

如果您在正则表达式中苦苦挣扎 - 为什么要继续使用它。并不是说它的代码会运行很多次,所以即使拆分它的速度较慢,它也可能更易于维护。 我使用 api 和后端,我想在两个站点中验证密码,我不想在每个 lenguajes 中重复验证功能,我认为使用 ragex 更好。 【参考方案1】:

您的正则表达式在正确的轨道上。我会使用:

^(?=.*?[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
$

【讨论】:

【参考方案2】:

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

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

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

^(?=[^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 次以上 .- $字符串结束

Regex demo

【讨论】:

以上是关于正则表达式验证不能包含某些字符的密码的主要内容,如果未能解决你的问题,请参考以下文章

js如何正则验证密码

用于密码验证的正则表达式

在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?

js验证密码的正则表达式

JAVA正则验证[密码]。验证规则:[5-20位字符,英文,数字或各种符号,不能存在单一形式]。 答案如下:

必须包含数字、字母、特殊字符三种的正则?