OC使用正则和NSPredicate的使用

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 *[email protected]"sh";
    if ([ppp evaluateWithObject:m]) {
        NSLog(@"包含 sh");
    }

    //判断是否全部是字母,matches 是整个都需要匹配的
    NSString *[email protected]"[A-Za-z]+";
    NSPredicate *pre=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",ss];
    NSString *[email protected]"mm";
    if ([pre evaluateWithObject:aaaa]) {
        NSLog(@"全是字母");
    }
    //判断是否包含
    [email protected]"mm";
    [email protected]"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 *[email protected]"<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 *[email protected]"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/HudongPreDemo

Gitosc下载:http://git.oschina.net/DamonHoo/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

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment