【问题标题】:Regex Password Validation using Or使用或的正则表达式密码验证
【发布时间】:2016-03-21 07:38:27
【问题描述】:

我需要使用以下规则验证密码:

密码必须有 6-12 个字符 以及以下至少两项: 大写字母、小写字母、数字或符号。 以下是我当前的正则表达式:

^((?=.*[a-z])|(?=.*[A-Z])|(?=.*\\d)|(?=.*(_|[-+_!@#$%^&*.,?]))).{6,12}

我正在为如何达到“至少”条件而苦苦挣扎。

【问题讨论】:

  • 仅使用正则表达式将非常困难。您也许可以通过将多个非消耗性前置条件表达式一个接一个地堆叠来做到这一点。
  • @LasseV.Karlsen:不难,只是看起来很尴尬。但是,6-12 个字符或更多是不清晰的。
  • 我会将这些要求拆分为一对独立的正则表达式。您将单独测试每个条件,如果不满足两个以上的条件,则会提示错误。
  • 好的,看起来实际上你可以将非消费组一个接一个地堆叠起来。由于我对此没有足够的经验,因此我不会将此作为答案发布,但您的正则表达式模式的结构将如下所示:@"(?<=P1)(?<=P2)(?<=P3)$" 其中 P1、P2 和 P3 是您需要检查密码的三件事.因此,例如要检查是否存在大写、小写、数字以及 6-12 的长度,您可以这样做:@"(?<=.*[A-Z].*[A-Z].*)(?<=.*[a-z].*[a-z].*)(?<=.*\d.*\d.*)(?<=.{6,12})$"
  • 三思而后行,我会将其作为答案发布,然后如果有人发现逻辑漏洞,则将其删除。

标签: ios objective-c regex


【解决方案1】:

您可以定义一个函数来逐一检查您的需求,并增加一个计数器来查看实际满足了多少需求。如果超过 1 个匹配且字符串长度在 6 到 12 之间,则密码通过。

NSUInteger checkPassword(NSString * haystack) {
    NSArray * arr = [NSArray arrayWithObjects: @"(?s).*\\d.*", @"(?s).*[a-z].*", @"(?s).*[A-Z].*", @"(?s).*[-+_!@#$%^&*.,?].*",nil];
    NSUInteger cnt = 0;
    for (NSUInteger index = 0; index < [arr count]; ++index) {
        NSPredicate * passTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", [arr objectAtIndex:index]];
        if ([passTest evaluateWithObject:haystack]) {
            cnt = cnt + 1;
        }
    }
    if (cnt > 1 && [haystack length] > 5 && [haystack length] < 13)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

还有一个示例IDEONE demo

NSString * s = @"123DF4ffg";
NSLog(@"Result: %d", checkPassword(s));
// => Result: 1

请注意,可以为此编写一个模式,但它会相当长且笨拙,因为您需要定义所有可能的前瞻替代方案对。

【讨论】:

    【解决方案2】:

    你可以试试这个

    ^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\\d\\w])|(?=.*\\w)(?=.*\\d))|(?=.*\\w)(?=.*[A-Z])(?=.*\\d)).{6,12}$;
    

    【讨论】:

      猜你喜欢
      • 2021-10-17
      相关资源
      最近更新 更多