在网上查询了一些资料,有张图解释的非常详细,如下所示:
NSPredicate类 即谓词已将整理过了,在此主要总结学习过的专门用于正则表达式的类即 NSRegularExpression的使用。
创建方法如下:
+ (NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error NS_DESIGNATED_INITIALIZER;
例如:<span style="font-size:18px;">NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"a(def|d)d" options:NSRegularExpressionCaseInsensitive error:nil];</span>options传入0即可。
打开API 发现它主要有以下几种用法:
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
其中第一个方法主要返回字符串指定范围内的符合正则的字符串,并把查询结果存在一个数组第二个方法主要返回指定字符串范围内符合正则条件的字符串的个数。
第三个方法主要返回第一个匹配成功的结果。
第四个方法主要返回第一个匹配成功结果的range 即在字符串中的位置信息。
第五个方法主要按照指定的模板或新的字串替换字符串对象内符合正则格式的串 最后生成一个新的总串并返回。
具体验证如下:
<span style="font-size:18px;">// // ViewController.m // 正则表达式的使用 // // Created by apple on 15/10/2. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 谓词NSPredicate中的self只仅仅用于字符串数组。但用于指明数组中对象属性也不会出错,没必要 // 注意:self就相当于数组中的一个对象 NSArray *strArray = @[@"abcda",@"acddf",@"acddfdff",@"wqwewe",@"xydsdsd"]; // 使用谓词取出第三个字符是d的字符串 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self like '??d*' "]; NSArray *filteArray = [strArray filteredArrayUsingPredicate:predicate]; for(NSString *filterStr in filteArray){ NSLog(@"%@",filterStr); } // 谓词条件语句使用MATCHES 来匹配正则语句——匹配语句 NSString *regex1 = @"^E.+e$"; // 以E开头,以小写e结尾的字符 NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"self matches %@",regex1]; if ([predicate2 evaluateWithObject:@"Easdsdsddsdsdse"]) { NSLog(@"匹配"); } /* 当为数组指定过滤器时,调用数组的对象方法filteredArrayUsingPredicate:方法指定NSPredicate对象。 当验证某个值或字符串对象是否符合指定的条件时 ,使用谓词的对象方法evaluateWithObject:方法 当Core Data中为查询请求指定条件时,使用NSFetchRequest类的对象方法 .predicate =XXX 赋值 */ /* 利用rangeOfString: options: 方法直接在一段落中寻找指定格式的字符串*/ NSString * str = @"// Do any,additional .setup after loading the view,typically from a nib."; NSRange range = [str rangeOfString:@"(?:[^,])*\\." options:NSRegularExpressionSearch]; if (range.location != NSNotFound) { NSLog(@"%@",[str substringWithRange:range]); } /*====================================================================*/ NSLog(@"================"); /*使用NSRegularExpression :进行正则匹配*/ // 格式一:寻找所有符合格式的子串 NSString *text = @"adefd sdsd xase add ayuertd ad xyzw"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"a(def|d)d" options:NSRegularExpressionCaseInsensitive error:nil]; NSArray *array = [regex matchesInString:text options:0 range:NSMakeRange(0,text.length)]; for(NSTextCheckingResult *b in array) { NSString *str = [text substringWithRange:b.range]; NSLog(@"%@",str); } // 格式二:获得匹配字符串的个数 NSUInteger numberOfMatches = [regex numberOfMatchesInString:text options:0 range:NSMakeRange(0,text.length)]; NSLog(@"%ld",numberOfMatches); // 格式三:替换匹配的字符串,生成新的字符串 NSString *modifiedString = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0,text.length) withTemplate:@"PPP"]; NSLog(@"%@",modifiedString); // 格式四:返回第一个匹配的结果 注意:NSTextCheckingResult 是个结构体变量,有结果所在的range NSTextCheckingResult *firstResult = [regex firstMatchInString:text options:0 range:NSMakeRange(0,text.length)]; NSLog(@"%@",[text substringWithRange:firstResult.range]); // 格式五:返回第一个正确匹配结果字符串的NSRange NSRange firstResultRange = [regex rangeOfFirstMatchInString:text options:0 range:NSMakeRange(0,NSStringFromRange(firstResultRange)); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end</span>运行结果如下: