检查该字符串是否包含字符集中的字符

时间:2015-06-05 10:55:46

标签: ios nspredicate

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

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

evaluateWithObject:方法返回NO,即使密码包含某个数字。

2 个答案:

答案 0 :(得分: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 :(得分:0)

NSPredicate与正则表达式一起使用时,您需要使用MATCHES,而不是CONTAINS(用于直接文字比较)。

可以说你不应该这样做。有一个论点,它应该在服务器上完成。

您还可以使用rangeOfCharacterFromSet:NSCharacterSet代替每个支票使用正则表达式。