我正在尝试找出使用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
中允许特殊字符作为第一个和最后一个字符的正确验证模式是什么?
答案 0 :(得分:1)
您需要删除字边界并在图案中添加问号:
@"^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%?])[0-9A-Za-z!@#$%?]{8,20}$"
请参阅regex demo。
模式开头和结尾的单词边界要求第一个和最后一个char为单词char(字母,数字或_
)。
另外,在前瞻中没有必要注意+?
,因为你只需要至少1个模式实例。