博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)
阅读量:5972 次
发布时间:2019-06-19

本文共 6714 字,大约阅读时间需要 22 分钟。

参考链接:

NSPredicate

Cocoa提供了一个NSPredicate类,它用来指定过滤器的条件

初始化方法

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

Format:

/*
*
 1.格式说明符
 %d和%@等插入数值和字符串,%K表示key
 还可以引入变量名,用$,类似环境变量,如:@"name == $NAME",再用predicateWithSubstitutionVariables调用来构造新的谓词(键/值字典),其中键是变量名,值是要插入的内容,注意这种情况下不能把变量当成键路径,只能用作值
 2.运算符
 
 ==等于
 
 >:大于
 
 >=和=>:大于或等于
 
 <:小于
 
 <=和=<:小于或等于
 
 !=和<>:不等于
 
 括号和逻辑运算AND、OR、NOT或者C样式的等效表达式&&、||、!
 
 注意:不等号适用于数字和字符串
 
 
 3. 数组运算符
 BETWEEN和IN后加某个数组,可以用{50,200},也可以用%@格式说明符插入自己的对象,也可以用变量
 
 4.SELF足够了
 self就表示对象本身
 
 5.字符串运算符
 BEGINSWITH:以某个字符串开头
 
 ENDSWITH:以某个字符串结束
 
 CONTAINS:包含某个字符串
 @"name ENDSWITH[d] 'ang'"
 
 [c],[d],[cd],后缀表示不区分大小写,不区分发音符号,两这个都不区分
 6.LIKE运算符
 
 类似SQL的LIKES
 
 LIKE,与通配符“*”表示任意多和“?”表示一个结合使用
 
 LIKE也接受[cd]符号
 
 7.MATCHES可以使用正则表达式
 NSString *regex = @"^A.+e$";   //以A开头,e结尾
 
*/

 

数组的类目:用来过滤数组

- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 

 可变数组可以直接过滤

- (
void)filterUsingPredicate:(NSPredicate *)predicate; 

 例:过滤出数组中的字符串中含有ang的元素

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

 单个对象的过滤

- (BOOL)evaluateWithObject:(
id)
object;

 例:判断字符串中首字母是不是字母

  NSString *regex = 
@"
[A-Za-z]+
";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"
SELF MATCHES %@
", regex];
    
    
if ([predicate evaluateWithObject:
@"
hahaa
"]) {
        NSLog(
@"
首字母含有字母
");
    }
else {
        NSLog(
@"
首字母不含字母
");
    }

过滤语句:邮箱过滤@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";

电话号码部分:@"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$"

NSRegularExpression

字符串替换

 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);
        }
    }

 NSPredicate测试:

其中自定义一个类,出事的时候给属性赋值,用runtime获取所有属性并重写description方法

@interface DataModel : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSInteger num;
@end
#import 
"
DataModel.h
"
#import <objc/runtime.h>
@implementation DataModel
- (instancetype)init
{
    self = [super init];
    
if (self) {
        self.name = 
@"
haha
";
        self.num = 
12;
    }
    
return self;
}
//
修改描述文件(获取所有属性存成字典)
- (NSString *)description {
    u_int               count;
    objc_property_t*    properties= class_copyPropertyList([self 
class], &count);
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    
for (
int i = 
0; i < count ; i++)
    {
        
const 
char* propertyName = property_getName(properties[i]);
        NSString *strName = [NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding];
        [dic setObject:[self valueForKey:strName] forKey:strName];
    }
    
return [NSString stringWithFormat:
@"
<%@ %p>:%@
",self.
class,&self,dic];
}

 例子:

//
(1)比较运算符>,<,==,>=,<=,!=
- (
void)test1 {
    DataModel *model = [[DataModel alloc]init];
    
//
类里面
    
/*
     self.name = @"haha";
     self.num = 12;
     
*/
    
//
可判定一个类的一个属性是否等于某个值,字符串是否相等
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"
num > 11
"];
    BOOL match = [predicate evaluateWithObject:model];
    NSLog(
@"
%@
",match?
@"
yes
":
@"
no
");
}
//
强悍的数组过滤功能
- (
void)test2 {
    NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
    DataModel *model1= [[DataModel alloc]init];
    DataModel *model2 = [[DataModel alloc]init];
    DataModel *model3 = [[DataModel alloc]init];
    model2.num = 
8;
    model3.name = 
@"
lala
";
    [mutableArray addObject:model1];
    [mutableArray addObject:model2];
    [mutableArray addObject:model3];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"
num > 10 AND name == 'lala'
"];
    [mutableArray filterUsingPredicate:predicate];
    NSLog(
@"
过滤出了: %@
",mutableArray);
}
//
含有变量的谓词,在这里用><会崩溃
- (
void)test3 {
    DataModel *model= [[DataModel alloc]init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"
name == $key
"];
    NSDictionary *dic = @{
@"
key
":
@"
haha
"};
    NSPredicate *predicate1 = [predicate predicateWithSubstitutionVariables:dic];
    NSLog(
@"
%@
",predicate1);
    BOOL match = [predicate1 evaluateWithObject:model];
    NSLog(
@"
%@
",match?
@"
yes
":
@"
no
");
}
//
BETWEEN
//
BETWEEN和IN后加某个数组,可以用{50,200},也可以用%@格式说明符插入自己的对象,也可以用变量
- (
void)test4 {
    NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
    DataModel *model1= [[DataModel alloc]init];
    DataModel *model2 = [[DataModel alloc]init];
    DataModel *model3 = [[DataModel alloc]init];
    model2.num = 
8;
    model3.num = 
20;
    [mutableArray addObject:model1];
    [mutableArray addObject:model2];
    [mutableArray addObject:model3];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"
num BETWEEN {5,15}
"];
    [mutableArray filterUsingPredicate:predicate];
    NSLog(
@"
过滤出了: %@
",mutableArray);
}
//
IN运算符
- (
void)test5 {
    
    NSArray *arrayFilter = [NSArray arrayWithObjects:
@"
abc1
"
@"
abc2
", nil];
    
    NSMutableArray *arrayContent = [NSMutableArray arrayWithObjects:
@"
a1
"
@"
abc1
"
@"
abc4
"
@"
abc2
", nil];
    
    
//
过滤出arrayContent 不包含 arrayFilter的元素
    NSPredicate *thePredicate = [NSPredicate predicateWithFormat:
@"
NOT (SELF in %@)
", arrayFilter];
    
    [arrayContent filterUsingPredicate:thePredicate];
    NSLog(
@"
%@
",arrayContent);
}
//
BEGINSWITH,ENDSWITH,CONTAINS
//
LIKE运算符(通配符)
- (
void)test6 {
    NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
    DataModel *model1= [[DataModel alloc]init];
    DataModel *model2= [[DataModel alloc]init];
    DataModel *model3= [[DataModel alloc]init];
    model1.name = 
@"
a123.png
";
    model3.name = 
@"
a.png
";
    [mutableArray addObject:model1];
    [mutableArray addObject:model2];
    [mutableArray addObject:model3];
    NSPredicate *predicate = [NSPredicate predicateWithFormat: 
@"
name LIKE[cd] 'a*.png'
"];
    [mutableArray filterUsingPredicate:predicate];
    NSLog (
@"
%@
", mutableArray);
}

 

转载于:https://www.cnblogs.com/hxwj/p/4827561.html

你可能感兴趣的文章
ecshop ajax无刷新登陆_无需整理
查看>>
Android中隐藏标题栏和状态栏
查看>>
浅显c#连接数据库
查看>>
15. SQL -- 游标(实例)
查看>>
plsql9.0.6.1665版本注册码
查看>>
Linux入门基础之grep命令详解及正则表达式
查看>>
Git 分布式版本控制 实战
查看>>
Linux之Find命令详解
查看>>
crysis2 video&cryengine3 editor show
查看>>
数据挖掘 numpy之数组定义
查看>>
Hibernate学习之SessionFactory的opensession 和 getCu...
查看>>
web网站服务(二)
查看>>
【第一期】网站打开错误问题解决方法集合
查看>>
j2ee开发防范URL攻击是个重要话题
查看>>
RSync实现文件备份同步
查看>>
如何判断一个服务是否正在运行
查看>>
精品软件 推荐 相当优秀的轻量级文本编辑器 Notepad2
查看>>
Lync 2013快速入门手册之三:组织Lync会议
查看>>
SQL SERVER 2008 表与约束的创建维护
查看>>
我的友情链接
查看>>