NSPredicate用于查询,原理和用法都类似于SQL中的where,作用主要用来过滤筛选符合要求的内容,oc 可以使用这个来进行各种筛选,也可以用这个类用正则表达式来筛选相关内容。
【一】NSPredicate的基本使用介绍
NSPredicate的定义很简单
NSPredicate *pp=[NSPredicate predicateWithFormat:@"SELF CONTAINS %@",str];
而 format 的表达式主要包括以下几个
(1)比较运算符>,<,==,>=,<=,!=
可用于数值及字符串
例:@"number > 100"
使用方法是这样的,比如说现在有一个类的对象叫 person,person 有一个属性是 number,这样就可以这样写,然后判断 number>100的person 的对象了,这个后面有 demo
NSPredicate *pre=[NSPredicate predicateWithFormat:@"number > 100"];
if ([pre evaluateWithObject:person]) {
NSLog(@"number>100");
}
(2)范围运算符:IN、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','beijing'}"
(3)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。
(4)通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
(5)正则表达式:MATCHES,正则表达式的写法采用international components
for Unicode (ICU)的正则语法。
例:NSString *regex = @"^A.+e$"; 这个表达式的作用是匹配以A开头,e结尾的字符串
@"name MATCHES %@",regex
(6)字符串本身:SELF
例:@“SELF == ‘APPLE’"
这个 self主要是用来被用来用在 NSString 上面,比如可以这样判断是否包含
【二】NSPredicate 的常用方法
(1)对象属性的判断
person *person1=[[person alloc]init];
person *person2=[[person alloc]init];
person *person3=[[person alloc]init];
[person1 setName:@"hudong"];
[person1 setNumber:10];
[person2 setName:@"blog"];
[person2 setNumber:50];
[person3 setName:@"com"];
[person3 setNumber:100];
NSPredicate *personPre=[NSPredicate predicateWithFormat:@"number > 20"];
NSArray *personArray=[NSArray arrayWithObjects:person1,person2,person3, nil];
for (int i=0; i<[personArray count]; i++) {
if ([personPre evaluateWithObject:[personArray objectAtIndex:i]]) {
NSLog(@"%@",((person*)[personArray objectAtIndex:i]).name);
}
}
(2)字符串的判断
//字符串相关[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号
NSPredicate *ppp=[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C]'SH'"];
NSString *m=@"sh";
if ([ppp evaluateWithObject:m]) {
NSLog(@"包含 sh");
}
//判断是否全部是字母,matches 是整个都需要匹配的
NSString *ss=@"[A-Za-z]+";
NSPredicate *pre=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",ss];
NSString *aaaa=@"mm";
if ([pre evaluateWithObject:aaaa]) {
NSLog(@"全是字母");
}
//判断是否包含
ss=@"mm";
aaaa=@"mm11";
pre=[NSPredicate predicateWithFormat:@"SELF CONTAINS %@",ss];
if ([pre evaluateWithObject:aaaa]) {
NSLog(@"含有字母mm");
}
//批量替换字符串
NSError* error = NULL;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(encoding=")[^"]+(")" options:0 error:&error];
NSString* sample = @"<xml encoding="abc"></xml><xml encoding="def"></xml><xml encoding="ttt"></xml>";
NSLog(@"Start:%@",sample);
NSString* result = [regex stringByReplacingMatchesInString:sample options:0 range:NSMakeRange(0, sample.length) withTemplate:@"$1utf-8$2"];
NSLog(@"Result:%@", result);
//截取字符串
//组装一个字符串,需要把里面的网址解析出来
NSString *urlString=@"<meta/><link/><title>1Q84 BOOK1</title></head><body>";
//NSRegularExpression类里面调用表达的方法需要传递一个NSError的参数。下面定义一个
NSError *error1;
//http+:[^s]* 这个表达式是检测一个网址的。(?<=title>).*(?=</title)截取html文章中的<title></title>中内文字的正则表达式
NSRegularExpression *regex1 = [NSRegularExpression regularExpressionWithPattern:@"(?<=title>).*(?=</title)" options:0 error:&error1];
if (regex != nil) {
NSTextCheckingResult *firstMatch=[regex1 firstMatchInString:urlString options:0 range:NSMakeRange(0, [urlString length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
//从urlString当中截取数据
NSString *result=[urlString substringWithRange:resultRange];
//输出结果
NSLog(@"->%@<-",result);
}
}
(3)数组和字典的常用
//筛选含有1的数组 ,contains 是含有
NSArray *array=[NSArray arrayWithObjects:@"beijing1",@"beijing2",@"beijing3",@"beijing4",@"beijing5", nil];
NSString *str=@"1";
NSPredicate *pp=[NSPredicate predicateWithFormat:@"SELF CONTAINS %@",str];
NSLog(@"%@",[array filteredArrayUsingPredicate:pp]);
//或者直接判断数组内对象,就是上面说的更快捷的方法
NSPredicate * pppre = [NSPredicate predicateWithFormat:@"number>20"];
NSArray *arrayPre=[personArray filteredArrayUsingPredicate: pppre];
NSLog(@"%@",[[arrayPre objectAtIndex: 0] name]);
//字典的占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys: @"Name1", @"NAME",@"num",@"num",nil];
NSPredicate *dicpre=[preTemplate predicateWithSubstitutionVariables: dic];//占位符就是字段对象里的key,因此你可以有多个占位符,只要key 不一样就可以了。
(4)其他常用
【三】demo 下载
Github下载: https://github.com/DamonHu/HudongBlogDemo/tree/master/HudongPreDemo
参考文章:
- http://blog.csdn.net/ztp800201/article/details/8116081
- http://blog.sina.com.cn/s/blog_859ab336010158dz.html
- http://blog.csdn.net/lovenjoe/article/details/8511709
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/144.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!