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

    一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^d{n}$ 3 至少n位的数字:^d{n,}$ 4 m-n位的数字...
    正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。下面整理一些常用的正则...
    0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的...
     正则表达式是从信息中搜索特定的模式的一把瑞士军刀。它们是一个巨大的工具库,其中的一些功能经常...
    一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数...
    \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n...