首先舉一個例子:
匹配9-15個由字母/數字組成的字符串的正則表達式:
? ? NSString * regex = @"^[A-Za-z0-9]{9,15}$";
? ? NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
? ? BOOL isMatch = [pred evaluateWithObject:txtfldPhoneNumber.text];
Cocoa用NSPredicate描述查詢的方式,原理類似于在數據庫中進行查詢
用BETWEEN,IN,BEGINWITH,ENDWITH,CONTAINS,LIKE這些謂詞來構造NSPredicate,必要的時候使用SELF直接對自己進行匹配
[cpp]?view plaincopy
?? NSPredicate?*predicate;?? predicate?=?[NSPredicate?predicateWithFormat:?@"name?==?'Herbie'"];?? ????BOOL?match?=?[predicate?evaluateWithObject:?car];?? ????NSLog?(@"%s",?(match)???"YES"?:?"NO");?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"engine.horsepower?>?150"];?? ????NSArray?*cars?=?[garage?cars];?? ????for?(Car?*car?in?[garage?cars])?{?? ????????if?([predicate?evaluateWithObject:?car])?{?? ????????????NSLog?(@"%@",?car.name);?? ????????}?? ????}?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"engine.horsepower?>?150"];?? ????NSArray?*results;?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ?? ????NSPredicate?*predicateTemplate?=?[NSPredicate?predicateWithFormat:@"name?==?$NAME"];?? ????NSDictionary?*varDict;?? ????varDict?=?[NSDictionary?dictionaryWithObjectsAndKeys:?? ???????????????@"Herbie",?@"NAME",?nil];?? ????predicate?=?[predicateTemplate?predicateWithSubstitutionVariables:?varDict];?? ????NSLog(@"SNORGLE:?%@",?predicate);?? ????match?=?[predicate?evaluateWithObject:?car];?? ??NSLog?(@"%s",?(match)???"YES"?:?"NO");?? ?? ?? ????? ????predicate?=?[NSPredicate?predicateWithFormat:?? ?????????????????@"(engine.horsepower?>?50)?AND?(engine.horsepower?<?200)"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"oop?%@",?results);?? ????? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?<?'Newton'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?[results?valueForKey:?@"name"]);?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?? ?????????????????@"engine.horsepower?BETWEEN?{?50,?200?}"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ????? ????NSArray?*betweens?=?[NSArray?arrayWithObjects:?? ?????????????????????????[NSNumber?numberWithInt:?50],?[NSNumber?numberWithInt:?200],?nil];?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"engine.horsepower?BETWEEN?%@",?betweens];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ????predicateTemplate?=?[NSPredicate?predicateWithFormat:?@"engine.horsepower?BETWEEN?$POWERS"];?? ????varDict?=?[NSDictionary?dictionaryWithObjectsAndKeys:?betweens,?@"POWERS",?nil];?? ????predicate?=?[predicateTemplate?predicateWithSubstitutionVariables:?varDict];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?IN?{?'Herbie',?'Snugs',?'Badger',?'Flap'?}"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?[results?valueForKey:?@"name"]);?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"SELF.name?IN?{?'Herbie',?'Snugs',?'Badger',?'Flap'?}"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?[results?valueForKey:?@"name"]);?? ????? ????names?=?[cars?valueForKey:?@"name"];?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"SELF?IN?{?'Herbie',?'Snugs',?'Badger',?'Flap'?}"];?? ????results?=?[names?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?BEGINSWITH?'Bad'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ????? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?BEGINSWITH?'HERB'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ????? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?BEGINSWITH[cd]?'HERB'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ?? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?LIKE[cd]?'*er*'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results);?? ????? ????predicate?=?[NSPredicate?predicateWithFormat:?@"name?LIKE[cd]?'???er*'"];?? ????results?=?[cars?filteredArrayUsingPredicate:?predicate];?? ????NSLog?(@"%@",?results); ?
NSPredicate用于查詢和過濾
在SQL中作為查詢條件通常用WHERE,但在COREDATA中作為查詢條件就可以用到NSPredicate.
NSPredicate 不單可以和COREDATA中的FetchRequest 配合使用。也可以與NSArray配合使用。
?
NSPredicate 中支持的關鍵詞和條件符:
1、>,<,>=,<=,= 比較運算符。
如:
???? NSPredicate * qcondition= [NSPredicate predicateWithFormat:@"salary >= 10000"];
2、字符串操作(包含):BEGINSWITH、ENDSWITH、CONTAINS
如:
????????@"employee.name BEGINSWITH[cd] '李'" //姓李的員工
???? @"employee.name ENDSWITH[c] '夢'"?? //以夢結束的員工
???? @"employee.name CONTAINS[d] '宗'"?? //包含有"宗"字的員工
注:[c]不區分大小寫[d]不區分發音符號即沒有重音符號[cd]既不區分大小寫,也不區分發音符號。
?
3、范圍:IN?? ,BWTEEN
如:
??? @"salary BWTEEN {5000,10000}"
??? @"em_dept IN '開發'"
?
4、自身:SELF,這個只針對字符數組起作用。
如:
???? NSArray * test = =[NSArray arrayWithObjects: @"guangzhou", @"beijing", @"shanghai", nil];
???? @"SELF='beijing'"
?
5、通配符:LIKE
???? LIKE 使用?表示一個字符,*表示多個字符,也可以與c、d 連用。
如:
???? @"car.name LIKE '?he?'" //四個字符中,中間為he
???? @"car.name LIKE '*jp'"?? //以jp結束
?
6、正則表達式:MATCHES
如:
NSString *regex = @"^E.+e$";//以E 開頭,以e 結尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Employee"]){
NSLog(@"matches YES");
}else{
NSLog(@"matches NO");
}
?
7、邏輯運算符:AND、OR、NOT
如:
????? @"employee.name = 'john' AND employee.age = 28"
?
8、占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
占位符就是字典對象里的key,因此你可以有多個占位符,只要key 不一樣就可以了。
?
對數組過濾:
如:
?NSMutableArray?*carsCopy = [carsmutableCopy];
? ? [carsCopyfilterUsingPredicate: predicate];//filterUsingPredicate和NSMutableArray構成新數組。
? ??NSLog?(@"%@", carsCopy);
?? ?
? ? predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > %d",?50];
? ? results = [cars?filteredArrayUsingPredicate: predicate];
? ??NSLog?(@"%@", results);
總結
以上是生活随笔為你收集整理的IOS自带正则表达式NSPredicate的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。