匹配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直接对自己进行匹配
- //基本的查询
- NSPredicate *predicate;
- predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"];
- BOOL match = [predicate evaluateWithObject: car];
- NSLog (@"%s", (match) ? "YES" : "NO");
- //在整个cars里面循环比较
- 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");
- //注意不能使用$VARIABLE作为路径名,因为它值代表值
- //谓词字符窜还支持c语言中一些常用的运算符
- 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);
- //IN运算符
- 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];//这里限制了SELF的范围
- NSLog (@"%@", results);
- //BEGINSWITH,ENDSWITH,CONTAINS
- //附加符号,[c],[d],[cd],c表示不区分大小写,d表示不区分发音字符,cd表示什么都不区分
- 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);
- //LIKE运算符(通配符)
- 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);