2015-06-05 4 views
2

Мне нужно проверить сложность пароля. Одним из условий является то, что пароль должен содержать хотя бы одно число. Я пробовал следующий подход, но он не дает ожидаемых результатов, и я не знаю, что случилось.Убедитесь, что строка содержит символ из набора символов

NSString *regexpNumbers = @"[0-9]+"; 
NSPredicate *predicateNumbers = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", regexpNumbers]; 
result &= [predicateNumbers evaluateWithObject:password]; 

valuWithObject: метод возвращает NO, даже если пароль содержит некоторое число.

ответ

1

Использование rangeOfCharacterFromSet:

Вы можете создать свой собственный набор символов, как способ:

NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"]; 
s = [s invertedSet]; 

NSString *string = @"String to find"; 
NSRange r = [string rangeOfCharacterFromSet:s]; 
if (r.location != NSNotFound) { 
    NSLog(@"the string contains illegal characters"); 
} else { 
    NSLog(@"Found!!!"); 
} 

Использование NSPredicate:

NSString *myRegex = @"[A-Z0-9a-z_]*"; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex]; 
NSString *string = @"String to find"; 
BOOL valid = [myTest evaluateWithObject:string]; 
+1

Благодарим Вас за подробное описание. – Merlin

0

При использовании NSPredicate с регулярным выражением вам необходимо использовать MATCHES, а не CONTAINS (который используется для прямого сравнения литералов).

Возможно, вы не должны этого делать. Существует аргумент, что это должно быть сделано на сервере.

Вместо использования регулярного выражения вы также можете использовать rangeOfCharacterFromSet: и NSCharacterSet для каждой вашей проверки.

+1

По-моему, вы делаете это на сервера и клиента. –

+0

Мы делаем эту проверку как на сервере, так и на клиенте. Я также пытался использовать MATCHES раньше, но проблема в том, что предикат с MATCHES возвращает NO, когда пароль содержит что-либо еще, кроме чисел. Кажется, что совпадения выполняет свою работу во всей строке ввода независимо от^и $ в регулярном выражении. – Merlin

Смежные вопросы