NSPredicate 密码格式
NSPredicate Password Format
我正在尝试找出使用 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
...不转义和转义字符串,但它不仅适用于这种类型的密码模式(其中特殊字符位于 first 和 last 密码字符串之后:
OverAndUnder21!
AreYouHere2?
PleaseDial9#
!4Ngrier!
!D4ngerZone
所有其他密码有效:
P@MyF8fulDog
classM8s4L!fe
等等...
我尝试在 regex101.com 中测试我的 RegEx 模式,它似乎完全匹配。
NSPredicate
中允许 特殊字符作为第一个和最后一个字符的正确验证模式是什么?
您需要删除单词边界并在模式中添加问号:
@"^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%?])[0-9A-Za-z!@#$%?]{8,20}$"
参见regex demo。
模式开头和结尾的单词边界要求第一个和最后一个字符是单词字符(字母、数字或_
)。
此外,请注意 +?
在前瞻中不是必需的,因为您只需要至少 1 个模式实例。
我正在尝试找出使用 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
...不转义和转义字符串,但它不仅适用于这种类型的密码模式(其中特殊字符位于 first 和 last 密码字符串之后:
OverAndUnder21!
AreYouHere2?
PleaseDial9#
!4Ngrier!
!D4ngerZone
所有其他密码有效:
P@MyF8fulDog
classM8s4L!fe
等等...
我尝试在 regex101.com 中测试我的 RegEx 模式,它似乎完全匹配。
NSPredicate
中允许 特殊字符作为第一个和最后一个字符的正确验证模式是什么?
您需要删除单词边界并在模式中添加问号:
@"^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%?])[0-9A-Za-z!@#$%?]{8,20}$"
参见regex demo。
模式开头和结尾的单词边界要求第一个和最后一个字符是单词字符(字母、数字或_
)。
此外,请注意 +?
在前瞻中不是必需的,因为您只需要至少 1 个模式实例。