NSPredicate密码格式

时间:2018-04-27 19:02:05

标签: objective-c regex nspredicate

我正在尝试找出使用NSPredicate验证密码字段的准确解决方案。这是我的代码:

-(int)checkPasswordStrength:(NSString *)password
{
    NSPredicate *validPassword = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b"];
    NSString *escapedPassword = [NSRegularExpression escapedPatternForString:password];
    if(![validPassword evaluateWithObject:escapedPassword]) {
        [Helper showAlertWithTitle:@"" Message:@"Password should contain 8 to 20 alphanumeric characters, one capitalized letter, and with at least one of the symbols (e.g. !@#$%?)"];
        return 0;
    }

    return 1;
}

我尝试了这些模式:

\\b^(?=.*[0-9]+?)(?=(.*\\d){1})(?=.*[a-zA-Z])(?=.*[!@#$%?]).*[0-9a-zA-Z!@#$%?]{8,20}\\b

\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b

\\b^(?=.*[0-9]+?)(?=.*[A-Z]+?)(?=.*[a-z]*?)(?=.*[!@#$%?]+?)[0-9A-z!@#$%?]{8,20}$\\b

...两个没有转义转义字符串,但它不仅适用于此类型的密码模式(其中特殊字符位于< strong>第一个和最后一个密码字符串):

OverAndUnder21!
AreYouHere2?
PleaseDial9#
!4Ngrier!
!D4ngerZone

所有其他密码都有效:

P@MyF8fulDog
classM8s4L!fe

等等......

我试图在regex101.com上测试我的RegEx模式,它似乎完全匹配。

NSPredicate中允许特殊字符作为第一个和最后一个字符的正确验证模式是什么?

1 个答案:

答案 0 :(得分:1)

您需要删除字边界并在图案中添加问号:

@"^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%?])[0-9A-Za-z!@#$%?]{8,20}$"

请参阅regex demo

模式开头和结尾的单词边界要求第一个和最后一个char为单词char(字母,数字或_)。

另外,在前瞻中没有必要注意+?,因为你只需要至少1个模式实例。