【问题标题】:Need to match at least 3 of given patterns in Regular Expression需要在正则表达式中匹配至少 3 个给定模式
【发布时间】:2013-07-26 07:47:38
【问题描述】:

我正在使用 MVC 4,剃刀开发应用程序。对于一次更改密码视图,我需要进行一些具有以下条件的验证:

它应该至少匹配以下 3 个:

1。大写字母字符

2。小写字母字符

3。数字

4。特殊键盘字符(脚本标签除外)

现在,我在模型中编写了以下正则表达式

[RegularExpression("^([a-zA-Z0-9#$%=@!{},`~&*()'?.:;_|^/+\"-]{8,32})$", ErrorMessage = "Current Password is invalid")]

但是,这将匹配任何给定的子集。我需要匹配其中至少 3 个。任何人都可以帮助我如何做到这一点?

【问题讨论】:

    标签: regex asp.net-mvc-4


    【解决方案1】:

    使用正则表达式进行密码验证可能不是一个好主意,但使用前瞻和 or 运算符 | 允许您这样做:

    ^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])).{8,32}$
    

    这个正则表达式有 4 个部分:

    (?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]) 
    

    确保至少有 1 个小写字母、1 个大写字母和 1 个数字。

    (?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])(?=.*[a-z])(?=.*[0-9]) 
    

    确保至少有 1 个特殊字符、1 个大写字母和 1 个数字。

    (?=.*[A-Z])(?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])(?=.*[0-9])
    

    确保至少有 1 个大写字母、1 个特殊字符和 1 个数字。

    (?=.*[A-Z])(?=.*[a-z])(?=.*[#$%=@!{},`~&*()'?.:;_|^/+\"-])
    

    确保至少有 1 个大写字母、1 个小写字母和 1 个特殊字符。

    | 与这四个(分组为非捕获组)一起使用可为您提供四分之三的验证。

    然后使用.{8,32}作为密码长度

    【讨论】:

    • 嗨,杰瑞,非常感谢。我很感激你的回应。但不幸的是,这个正则表达式对我不起作用。我也试着只放第一部分,但它仍然没有用。正如您所提到的,使用正则表达式验证密码字段可能不是一个好主意。你能建议我一个更好的方法吗?
    • @SuhaniMody 你所说的“不适合你”是什么意思?你有任何错误吗?另一种方法是分别检查每个实例,例如,每次成功检查返回 1,将每个结果相加,如果总和至少为 3,则密码有效。
    • 嗨,杰瑞,我试着把第一部分作为正则表达式。 (?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]) ,但它允许任何上字母、下字母或数字。不是全部。
    • @SuhaniMody 你用锚了吗?它正在工作here
    • 是的@Jerry 我在测试这个单独或组合的正则表达式时使用了锚点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2013-05-29
    • 2013-06-14
    相关资源
    最近更新 更多