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)其他常用

ios判断邮箱,手机号码,车牌号

【三】demo 下载

Github下载: https://github.com/DamonHu/HudongBlogDemo/tree/master/HudongPreDemo

参考文章:


☟☟可点击下方广告支持一下☟☟

最后修改:2021 年 03 月 07 日
请我喝杯可乐,请随意打赏: ☞已打赏列表