Ios 使用或进行正则表达式密码验证

Ios 使用或进行正则表达式密码验证,ios,objective-c,regex,Ios,Objective C,Regex,我需要使用以下规则验证密码: 密码必须包含6-12个字符 以及至少以下两项: 大写字母、小写字母、数字或符号。 以下是我当前的正则表达式: ^((?=.*[a-z])|(?=.*[A-Z])|(?=.*\\d)|(?=.*(_|[-+_!@#$%^&*.,?]))).{6,12} 我正在为如何设置“至少”条件而苦苦挣扎。您可以定义一个函数来逐个检查您的需求,并增加一个计数器以查看实际满足了多少需求。如果匹配的字符串超过1个,且字符串长度介于6和12之间,则密码通过 NSUInteger

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

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

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

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

您可以定义一个函数来逐个检查您的需求,并增加一个计数器以查看实际满足了多少需求。如果匹配的字符串超过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;
    }
}
注意可以为此编写一个模式,但这将非常冗长和笨拙,因为您需要定义所有可能的前瞻备选方案对。

您可以尝试使用此选项

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

仅仅用一个正则表达式就很难做到这一点。您可以通过将多个非消耗性预条件表达式堆叠在一起来实现这一点。@LasseV.Karlsen:不难,只是看起来很尴尬。但是,6-12个或更多字符是不合适的。我会将这些要求分成几个单独的正则表达式。您将单独测试每个条件,并在两个以上的条件不满足时提示一个错误。好的,看起来实际上您可以将非消费组堆叠在彼此之后。因为我没有足够的经验,所以我不会将此作为一个答案发布,但您的正则表达式模式的结构将是这样的:
@”(?仔细想想,我会将其作为一个答案发布,然后如果有人发现逻辑中有漏洞,就将其删除。
^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\\d\\w])|(?=.*\\w)(?=.*\\d))|(?=.*\\w)(?=.*[A-Z])(?=.*\\d)).{6,12}$;