1、比较运算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"
2、逻辑运算符:AND、OR、NOT 这几个运算符计算并、或、非的结果。
3、范围运算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {‘shanghai‘,‘nanjing‘}"
4、字符串本身:SELF
例:@"SELF == ‘APPLE‘"
5、字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例: @"name CONTAIN[cd] ‘ang‘" //包含某个字符串
@"name BEGINSWITH[c] ‘sh‘" //以某个字符串开头
@"name ENDSWITH[d] ‘ang‘" //以某个字符串结束
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。
6、通配符:LIKE
例:@"name LIKE[cd] ‘*er*‘" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] ‘???er*‘"
7、正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
三、如何使用NSPredicate对一个自定义的实体进行筛选
创建一个实体类 Person
@interface Person : NSManagedObject
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * firstname;
@property (nonatomic, retain) NSString * lastname;
@end
我们创建5个Person类的实体
Person *person1 = [Person new];
person1.age = @21;
person1.lastname = @"zhang";
person1.firstname = @"san";
Person *person2 = [Person new];
person2.age = @25;
person2.lastname = @"li";
person2.firstname = @"si";
Person *person3 = [Person new];
person3.age = @31;
person3.lastname = @"wang";
person3.firstname = @"wu";
Person *person4 = [Person new];
person4.age = @35;
person4.lastname = @"zhao";
person4.firstname = @"liu";
Person *person5 = [Person new];
person5.age = @41;
person5.lastname = @"test";
person5.firstname = @"san";
然后创建一个数组将这个对象全部存进去
NSArray *personArray = [NSArray arrayWithObjects:person1,person2,person3,person4,person5, nil];
使用NSPredicate进行筛选
//创建谓词的对象 谓词条件是基于KVC的,
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"lastname=‘wang‘ AND firstname==‘wu‘"];
for(Person * person in personArray)
{
if([predicate evaluateWithObject: person])
{
NSLog(@" person.lastname = %@",person.lastname);
}
}
打印结果是:person.lastname = wang
NSPredicate筛选一个对象逻辑还是很清晰的,不过这里比较麻烦的就是 还有一个循环,这里我们会发现数组提供了
一个方法可以更方便的检索数组对象
如下:
NSArray *arrayPre=[personArray filteredArrayUsingPredicate: predicate];
for (PersonOne *person in arrayPre) {
NSLog(@"person.lastname = %@", person.lastname);
}
看到这里发现NSPredicate 可以用于自定义的实体的检索、筛选,那如果用于 NSString,NSInteger,bool呢?
那我们再看一段代码吧:
NSArray *arrays = [NSArray arrayWithObjects: @"JK_RUI", @"KERP", @"SOFT", nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF==‘SOFT‘"];
NSArray *resultArr = [arrays filteredArrayUsingPredicate:predicate];
for (NSString *tempStr in resultArr) {
NSLog(@"tempStr = %@", tempStr);
}
打印结果:tempStr = SPOFT
四、使用NSPredicate在两个数组之间进行差异筛
NSArray* array = @[@"apple",@"iPhone"];
NSArray* array2 = @[@"apple",@"iPhone",@"ipad",@"mac"];
NSPredicate* thePredicate = [NSPredicate predicateWithFormat:@"NOT(SELF in %@)",array];
NSArray* arr3 = [array2 filteredArrayUsingPredicate:thePredicate];
NSLog(@"arr3=%@",arr3);
上面的代码输出结果 arr3={@"ipad" ,@"mac"}
五、如何正确使用正则筛选一个数组
NSString *regex = @"^A.+e$";//以A 开头,以e 结尾的字符。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Apple"]){
printf("YES\n");
}else{
printf("NO\n");
}
六、关于NSPredicate的其他说明和注意事项,以及技巧