文档章节

IOS NSPredicate 查询、搜索

CEOIOS
 CEOIOS
发布于 2015/01/27 20:46
字数 909
阅读 41
收藏 0

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取。

最常用到的函数

+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...;

1.比较运算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"

 

2.范围运算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
      @"address IN {'shanghai','nanjing'}"

3.字符串本身:SELF 
例:@"SELF == 'APPLE'"

4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'"   //包含某个字符串
      @"name BEGINSWITH[c] 'sh'"     //以某个字符串开头
      @"name ENDSWITH[d] 'ang'"      //以某个字符串结束
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。

5.通配符:LIKE
例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].
      @"name LIKE[cd] '???er*'"

 

6.正则表达式:MATCHES
例:NSString *regex = @"^A.+e$";   //以A开头,e结尾
      @"name MATCHES %@",regex

 

实际应用:对NSArray进行过滤

NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai",@"guangzou",@"wuhan", nil];  
NSString *string = @"ang";  
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@",string];  
NSLog(@"%@",[array filteredArrayUsingPredicate:pred]);

 

实际应用:判断字符串首字母是否为字母

NSString *regex = @"[A-Za-z]+";  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; if ([predicate evaluateWithObject:aString]) {  
}

实际应用:字符串替换

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 *error; //http+:[^\\s]* 这个表达式是检测一个网址的。(?<=title\>).*(?=</title)截取html文章中的<title></title>中内文字的正则表达式  NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=title\\>).*(?=</title)" options:0 error:&error]; if (regex != nil) {  
    NSTextCheckingResult *firstMatch=[regex firstMatchInString:urlString options:0 range:NSMakeRange(0, [urlString length])]; if (firstMatch) {  
        NSRange resultRange = [firstMatch rangeAtIndex:0]; //从urlString当中截取数据  NSString *result=[urlString substringWithRange:resultRange]; //输出结果  NSLog(@"->%@<-",result);  
    }  
      
}

实际应用:判断手机号码,电话号码函数

// 正则判断手机号码地址格式 - (BOOL)isMobileNumber:(NSString *)mobileNum
{ /**
        * 手机号码
        * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
        * 联通:130,131,132,152,155,156,185,186
        * 电信:133,1349,153,180,189 */ NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$"; /**
        10         * 中国移动:China Mobile
        11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
        12 */ NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$"; /**
        15         * 中国联通:China Unicom
        16         * 130,131,132,152,155,156,185,186
        17 */ NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$"; /**
        20         * 中国电信:China Telecom
        21         * 133,1349,153,180,189
        22 */ NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$"; /**
        25         * 大陆地区固话及小灵通
        26         * 区号:010,020,021,022,023,024,025,027,028,029
        27         * 号码:七位或八位
        28 */ // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";  NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
     NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
     NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
     NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; if (([regextestmobile evaluateWithObject:mobileNum] == YES) || ([regextestcm evaluateWithObject:mobileNum] == YES) || ([regextestct evaluateWithObject:mobileNum] == YES) || ([regextestcu evaluateWithObject:mobileNum] == YES))
    { if([regextestcm evaluateWithObject:mobileNum] == YES) {
          NSLog(@"China Mobile");
        } else if([regextestct evaluateWithObject:mobileNum] == YES) {
          NSLog(@"China Telecom");
        } else if ([regextestcu evaluateWithObject:mobileNum] == YES) {
          NSLog(@"China Unicom");
        } else {
          NSLog(@"Unknow");
        } return YES;
    } else { return NO;
    }
}

实际应用:邮箱验证、电话号码验证

//是否是有效的正则表达式 +(BOOL)isValidateRegularExpression:(NSString *)strDestination byExpression:(NSString *)strExpression

{

   NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", strExpression]; return [predicate evaluateWithObject:strDestination];

} //验证email +(BOOL)isValidateEmail:(NSString *)email {

   NSString *strRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";

   BOOL rt = [CommonTools isValidateRegularExpression:email byExpression:strRegex]; return rt;

} //验证电话号码 +(BOOL)isValidateTelNumber:(NSString *)number {

   NSString *strRegex = @"[0-9]{1,20}";

   BOOL rt = [CommonTools isValidateRegularExpression:number byExpression:strRegex]; return rt;

}

实际应用:NSDate进行筛选

//日期在十天之内: NSDate *endDate = [[NSDate date] retain];
NSTimeInterval timeInterval= [endDate timeIntervalSinceReferenceDate];
timeInterval -=3600*24*10;
NSDate *beginDate = [[NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval] retain]; //对coredata进行筛选(假设有fetchRequest) NSPredicate *predicate_date = [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", beginDate,endDate];
    
[fetchRequest setPredicate:predicate_date]; //释放retained的对象 [endDate release];
[beginDate release];


© 著作权归作者所有

CEOIOS
粉丝 8
博文 42
码字总数 24961
作品 0
深圳
程序员
私信 提问
iOS中3种正则表达式的使用与比较

之前我在博文中介绍过iOS中自带正则表达式的使用( 传送门),后来我发现其实iOS中有三种方式来实现正则表达式的匹配。现在将他们都记录在这里: 1.利用NSPredicate(谓词)匹配 例如匹配有效...

独-奏
2014/02/12
18.2K
1
Knowledge-Reserve

Knowledge-Reserve ComputerOperatingSystem 编译 静态库&动态库(Linux) 静态链接&动态链接 内存 内联函数&宏 Static&Const 死锁 线程安全 线程同步 锁 DataStructure Programme 集约型&离散...

旭宝爱吃鱼
2018/08/16
0
0
iOS中NSArray的高级应用-过滤

c/c++开发人员一定很喜欢用boost库,它有很强大的容器功能,在iOS开发中Array也相当于容器,功能也比较强大。NSArray可以用NSPredicate来过滤数组内容,NSPredicate有点像sql+正则表达,具体...

长平狐
2012/08/13
222
0
WinObjC 0.1.160621 预览版发布

WinObjC 0.1 预览版发布了,WinObjC 是 微软开源的 Winodws 到 iOS 的“桥梁”。 Windows Bridge for iOS (WinObjC) 为 Visual Studio/Windows 提供一个 Objective-C 开发环境。此外,WinOb...

oschina
2016/06/26
3.4K
4
PHP POST接收处理 IOS上传NSData图片数据,上传图片到服务器

【IOS 接收PHP 图片】 1,PHP将图片的URL直接返回给IOS端即可,IOS获取到URL处理,下载缓存就可以在APP端使用了。 【IOS上传图片PHP接收】 1、IOS上传图片可能有很多方法,今天作者我用了这种...

RablePHP
2014/11/28
8.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
25分钟前
1
0
OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
2.1K
17
oracle ORA-39700: database must be opened with UPGRADE option

ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option 进程 ID: 3650 会话 ID: 29......

Tank_shu
今天
3
0
分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
聊聊DubboDefaultPropertiesEnvironmentPostProcessor

序 本文主要研究一下DubboDefaultPropertiesEnvironmentPostProcessor DubboDefaultPropertiesEnvironmentPostProcessor dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/au......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部