參考鏈接:http://www.cocoachina.com/industry/20140321/8024.html
NSPRedicate
Cocoa提供了一個(gè)NSPredicate類,它用來指定過濾器的條件
初始化方法
+ (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...;
Format:
/**
1.格式說明符
%d和%@等插入數(shù)值和字符串,%K表示key
還可以引入變量名,用$,類似環(huán)境變量,如:@"name == $NAME",再用predicateWithSubstitutionVariables調(diào)用來構(gòu)造新的謂詞(鍵/值字典),其中鍵是變量名,值是要插入的內(nèi)容,注意這種情況下不能把變量當(dāng)成鍵路徑,只能用作值
2.運(yùn)算符
==等于
>:大于
>=和=>:大于或等于
<:小于
<=和=<:小于或等于
!=和<>:不等于
括號(hào)和邏輯運(yùn)算AND、OR、NOT或者C樣式的等效表達(dá)式&&、||、!
注意:不等號(hào)適用于數(shù)字和字符串
3. 數(shù)組運(yùn)算符
BETWEEN和IN后加某個(gè)數(shù)組,可以用{50,200},也可以用%@格式說明符插入自己的對(duì)象,也可以用變量
4.SELF足夠了
self就表示對(duì)象本身
5.字符串運(yùn)算符
BEGINSWITH:以某個(gè)字符串開頭
ENDSWITH:以某個(gè)字符串結(jié)束
CONTAINS:包含某個(gè)字符串
@"name ENDSWITH[d] 'ang'"
[c],[d],[cd],后綴表示不區(qū)分大小寫,不區(qū)分發(fā)音符號(hào),兩這個(gè)都不區(qū)分
6.LIKE運(yùn)算符
類似SQL的LIKES
LIKE,與通配符“*”表示任意多和“?”表示一個(gè)結(jié)合使用
LIKE也接受[cd]符號(hào)
7.MATCHES可以使用正則表達(dá)式
NSString *regex = @"^A.+e$"; //以A開頭,e結(jié)尾
*/
數(shù)組的類目:用來過濾數(shù)組
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;
可變數(shù)組可以直接過濾
- (void)filterUsingPredicate:(NSPredicate *)predicate;
例:過濾出數(shù)組中的字符串中含有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]);
單個(gè)對(duì)象的過濾
- (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}";
電話號(hào)碼部分:@"^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);
字符串中截取字符串
//組裝一個(gè)字符串,需要把里面的網(wǎng)址解析出來
NSString *urlString=@"<meta/><link/><title>1Q84 BOOK1</title></head><body>";
//NSRegularExpression類里面調(diào)用表達(dá)的方法需要傳遞一個(gè)NSError的參數(shù)。下面定義一個(gè)
NSError *error;
//http+:[^//s]* 這個(gè)表達(dá)式是檢測(cè)一個(gè)網(wǎng)址的。(?<=title/>).*(?=</title)截取html文章中的<title></title>中內(nèi)文字的正則表達(dá)式
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當(dāng)中截取數(shù)據(jù)
NSString *result=[urlString substringWithRange:resultRange];
//輸出結(jié)果
NSLog(@"->%@<-",result);
}
}
NSPredicate測(cè)試:
其中自定義一個(gè)類,出事的時(shí)候給屬性賦值,用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)比較運(yùn)算符>,<,==,>=,<=,!=
- (void)test1 {
DataModel *model = [[DataModel alloc]init];
//類里面
/*
self.name = @"haha";
self.num = 12;
*/
//可判定一個(gè)類的一個(gè)屬性是否等于某個(gè)值,字符串是否相等
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"num > 11"];
BOOL match = [predicate evaluateWithObject:model];
NSLog(@"%@",match?@"yes":@"no");
}
//強(qiáng)悍的數(shù)組過濾功能
- (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);
}
//含有變量的謂詞,在這里用><會(huì)崩潰
- (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后加某個(gè)數(shù)組,可以用{50,200},也可以用%@格式說明符插入自己的對(duì)象,也可以用變量
- (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運(yùn)算符
- (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運(yùn)算符(通配符)
- (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);
}