NSPredicate - 用两个条件进行评估

3
我想知道如何使用NSPredicate评估满足两个条件的NSString。例如,如何检查一个字符串至少应该有一个大写字母和至少一个数字。
3个回答

1
您可以使用AND运算符来满足两个或多个条件。
 NSManagedObjectContext *context = [appDelegate managedObjectContext];
 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDescription];

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"fbUID = %@ AND birthDate = %d AND birthMonth = %d AND greetingYear = %d", uID, birthDate, birthMonth, greetingYear];

//NSLog(@"%@ :",predicate);
[fetchRequest setPredicate:predicate];

 NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

你可以在NSPredicate 这里 进行更多检查。


嗨,你的答案看起来是正确的。但是我能够使用几行代码中的正则表达式来完成它。感谢你的帮助。 - nath

1
一种方法是:

这样做:

NSCharacterSet *upperCaseCharacters = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLKMNOPQRSTUVWXYZ"];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    return ([evaluatedObject rangeOfCharacterFromSet:upperCaseCharacters].location != NSNotFound && [evaluatedObject rangeOfCharacterFromSet:numbers].location != NSNotFound);

}];

NSString *stringToEvaluate = @"aasad5D";

BOOL result = [predicate evaluateWithObject:stringToEvaluate];

另一种解决方案是复合谓词,例如查看此问题以了解如何使用复合谓词 create a Compound Predicate in coreData xcode iphone

嗨,你的答案看起来是正确的。但是我能够使用几行代码中的正则表达式来完成它。感谢你的帮助。 - nath

0

我自己找到了解决方案。我使用了正则表达式和谓词来解决这个问题。

NSPredicate *pwdCheck = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"(?=.*?[A-Z])(?=.*?[0-9]).*"];
bool isValid = [pwdCheck evaluateWithObject:@"99a99A3w"];

感谢您的帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接