Я пытаюсь найти точное решение для проверки поля пароля с помощью 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
... Оба без экранирования и экранирования строк, но это не будет работать только для этого типа шаблонов паролей (где специальные символы находятся после первая и последняя строка пароля):
OverAndUnder21!
AreYouHere2?
PleaseDial9#
!4Ngrier!
!D4ngerZone
Все остальные пароли работают:
P@MyF8fulDog
classM8s4L!fe
И так далее ...
Я попытался проверить свои шаблоны RegEx на regex101.com, и, похоже, он полностью соответствует.
Каков правильный шаблон проверки в NSPredicate
, чтобы разрешить специальным символам в качестве первого и последнего символов ?