2015-06-05 369 views
2

我需要检查密码的复杂性。其中一个条件是密码必须至少包含一个数字。我尝试了以下方法,但它没有给我预期的结果,我不知道什么是错的。检查字符串是否包含字符集中的字符

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

evaluateWithObject:即使密码包含某个数字,方法也会返回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

相关问题