【问题标题】:Reg-Ex for password validation fails用于密码验证的 Reg-Ex 失败
【发布时间】:2015-08-28 10:53:36
【问题描述】:

您好,我的密码应该包含,

1. minimum 8 characters
2. minimum 1 special character
3. minimum 1 number

我正在使用以下正则表达式,

/^.*(?=.{8,})(?=.*d)(?=.*[A-z])(?=.*[!@#$%^&*? ]).*$/

但这不接受字符串AAAA2@AAAA,它有8 个字符长,有一个特殊字符@ 和一个数字2。我对 RegEx 的了解很少。你能告诉我这个表达有什么问题吗?

【问题讨论】:

    标签: regex


    【解决方案1】:

    字符串不被接受的原因是你忘记了d的斜线,而正则表达式要求字母d在字符串内。修复是

    ^(?=.{8,})(?=.*\d)(?=.*[A-Z])(?=.*[!@#$%^&*? ]).*$
     ^             ^^
    

    i 修饰符一起使用。 See demo

    [A-z] 问题是well-known one。此外,应该删除初始的.*,否则正则表达式的某些部分将无法正确验证。

    谈到优化:长度检查几乎总是可以移到最后:

    ^(?=.*\d)(?=.*[A-Z])(?=.*[!@#$%^&*? ]).{8,}$
    

    another demo(再次注意i修饰符)。

    另外,请参阅Fine-Tuning: Removing One Condition

    如果您必须检查n 条件,您的模式最多只需要包含n-1 前瞻。通常,您甚至可以将多个条件组合成一个前瞻。

    只要您的条件如上所示(1)最少 8 个字符,2)最少 1 个特殊字符,3)最少 1 个数字) - 没有英文字母要求 - 你甚至可以使用

    ^(?=.*\d)(?=.*[!@#$%^&*? ]).{8,}$
    

    【讨论】:

    • 嗯,这也将匹配 AAAA2@[]AA,由于 [] 不在提供的字符类中,因此不清楚这是否合适。
    【解决方案2】:

    你可以使用:

    ^(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&*? ])[!@#$%^&*? a-zA-Z\d]{8,}$
    

    [A-z] 不正确,将匹配 ASCII 65-122 范围内的更多字符,例如 []、` 等。

    RegEx Demo

    【讨论】:

    • 1. 对于 aaaaaaaaaa1!ABCabc1! 或任何没有字符 d 的字符串,此表达式将失败。 2. 在我的要求中,用户只能输入不带大写字母的小写字母,但是这个表达式要求字符串同时包含一个小写字母和一个大写字母
    • 这实际上是问题中的复制/粘贴错误。 d 应该是 \d 的数字。立即查看更新的内容。
    猜你喜欢
    • 2016-03-03
    • 2023-03-03
    • 1970-01-01
    • 2020-09-21
    • 2015-04-19
    • 2021-02-28
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多