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);
  • }
  • }
  • 相关文章

    正则替换html代码中img标签的src值在开发富文本信息在移动端...
    正则表达式
    AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
    正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
    Python界一名小学生,热心分享编程学习。
    收集整理每周优质开发者内容,包括、、等方面。每周五定期发...