NSPredicate及正则的一点使用

在语言上,谓语,谓词是用来判断的,比如“我是程序猿”中的是,就是表判断的谓语,“是”就是一个谓词,在objective-c中,应该说在COCOA中的NSPredicate表示的就是一种判断。一种条件的构建。我们可以先通过NSPredicate中的predicateWithFormat方法来生成一个NSPredicate对象表示一个条件,然后在别的对象中通过evaluateWithObject方法来进行判断,返回一个布尔值。还是看代码简单明了:

[plain] view plain copy
  1. #import<Foundation/Foundation.h>
  2. @interfaceHuman:NSObject
  3. {
  4. NSString*name;
  5. intage;
  6. Human*child;
  7. }
  8. @property(copy)NSString*name;
  9. @propertyintage;
  10. @end
  11. @implementationHuman
  12. @synthesizename;
  13. @synthesizeage;
  14. intmain(intargc,constchar*argv[])
  15. @autoreleasepool{
  16. //利用kvc进行对象初始化
  17. Human*human=[[Humanalloc]init];
  18. Human*child=[[Humanalloc]init];
  19. [humansetValue:@"holydancer"forKey:@"name"];
  20. [humansetValue:[NSNumbernumberWithInt:20]forKey:@"age"];
  21. [humansetValue:childforKey:@"child"];
  22. [humansetValue:[NSNumbernumberWithInt:5]forKeyPath:@"child.age"];
  23. NSPredicate*predicate1=[NSPredicatepredicateWithFormat:@"name=='holydancer'"];//创建谓词判断属性
  24. NSPredicate*predicate2=[NSPredicatepredicateWithFormat:@"child.age==5"];//创建谓词判断属性的属性
  25. //此处在创建谓词时可以有好多种条件写法,比如大小比较,范围验证,甚至像数据库操作那样的like运算符,这里就不一一列举了
  26. BOOLtmp1=[predicate1evaluateWithObject:human];//验证谓词是否成立,得到布尔返回值
  27. BOOLtmp2=[predicate2evaluateWithObject:human];
  28. if(tmp1){
  29. NSLog(@"human对象的name属性为'holydancer'");
  30. if(tmp2){
  31. NSLog(@"human对象的child属性的age为5");
  32. return0;
  33. }
Objective-c代码
  1. NSString*regex=@"[A-Za-z]+";
  2. NSPredicate*predicate=[NSPredicatepredicateWithFormat:@"SELFMATCHES%@",regex];
  3. if([predicateevaluateWithObject:aString]){
  4. }


判断Array中是否包含某一规则的对象,并返回一个数组:
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@",regex];
并调用:- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 方法即可。
获得一个数组中某些对象除外的数组:
NSPredicate *notPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)",arrayFilter2];且还是要调用- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 方法。
同样,如果我们想找出某个范围内的对象,创建如下Predicate (这里可以用到所有的比较操作符): NSPredicate *pre = [NSPredicate predicateWithFormat:@"self.*** < 5"];
并调用:- (BOOL)evaluateWithObject:(id)object;方法。
在这里啰嗦一句,如果只是在数组中查找是否存在对象时用indexOfObject,如果不存在则返回为NSNotFound.
字符串替换:
NSError*error=NULL;
  • NSRegularExpression*regex=[NSRegularExpressionregularExpressionWithPattern:@"(encoding=\")[^\"]+(\")"
  • options:0
  • error:&error];
  • NSString*sample=@"<xmlencoding=\"abc\"></xml><xmlencoding=\"def\"></xml><xmlencoding=\"ttt\"></xml>";
  • NSLog(@"Start:%@",sample);
  • NSString*result=[regexstringByReplacingMatchesInString:sample
  • range:NSMakeRange(0,sample.length)
  • withTemplate:@"$1utf-8$2"];
  • NSLog(@"Result:%@",result);

  • 截取字符串如下:
    //组装一个字符串,需要把里面的网址解析出来
  • NSString*urlString=@"<meta/><link/><title>1Q84BOOK1</title></head><body>";
  • //NSRegularExpression类里面调用表达的方法需要传递一个NSError的参数。下面定义一个
  • NSError*error;
  • //http+:[^\\s]*这个表达式是检测一个网址的。(?<=title\>).*(?=</title)截取html文章中的<title></title>中内文字的正则表达式
  • NSRegularExpression*regex=[NSRegularExpressionregularExpressionWithPattern:@"(?<=title\\>).*(?=</title)"options:0error:&error];
  • if(regex!=nil){
  • NSTextCheckingResult*firstMatch=[regexfirstMatchInString:urlStringoptions:0range:NSMakeRange( if(firstMatch){
  • NSRangeresultRange=[firstMatchrangeAtIndex:0];
  • //从urlString当中截取数据
  • NSString*result=[urlStringsubstringWithRange:resultRange];
  • //输出结果
  • NSLog(@"->%@<-",result);
  • }
  • }
  • 相关文章

    jquery.validate使用攻略(表单校验) 目录 jquery.validate...
    /\s+/g和/\s/g的区别 正则表达式/\s+/g...
    自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母...
    this.optional(element)的用法 this.optional(element)是jqu...
    jQuery.validate 表单动态验证 实际上jQuery.validate提供了...
    自定义验证之这能输入数字(包括小数 负数 ) &lt;script ...