美文网首页iOS开发笔记
iOS中NSRegularExpression正则表达式的使用

iOS中NSRegularExpression正则表达式的使用

作者: 祥子_HelloWorld | 来源:发表于2019-07-31 00:02 被阅读0次

初始化一个NSRegularExpression对象,注:_str是要匹配的字符串

NSRegularExpression *regex = [NSRegularExpression 
regularExpressionWithPattern:@"http://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?" 
options:NSRegularExpressionCaseInsensitive error:nil];

获得所有匹配了表达式的字符串。

    NSArray *array =    nil;
    array = [regex matchesInString:_str options:0 range:NSMakeRange(0, [_str length])];
    NSString *str1 = nil;
    for (NSTextCheckingResult* b in array)
    {
         str1 是每个和表达式匹配好的字符串。
        str1 = [_str substringWithRange:b.range];
        NSLog(@" str 1 is %@",str1);
    }

获得匹配的字符串的个数

NSUInteger numberOfMatches = [regex numberOfMatchesInString:_str options:0 
range:NSMakeRange(0, [_str length])];

替换匹配的字符串$0很重要$0不行的话$1依此类推,打印了看结果

    NSString *modifiedString = [regex stringByReplacingMatchesInString:_str
                                                               options:0
                                                                 range:NSMakeRange(0, [_str length])
                                                          withTemplate:@"<a href=\"$0\">$0</a>"];
    NSLog(@"######## the modified string is %@",modifiedString);

提供一个网页版的JavaScript 调试工具,非常给力:http://www.renrousousuo.com/tools/regex_debug.html

  • 如果在检索的文本中需要检索包含正则表达式的关键字,如 "[ ]" 那么在 拼装字符串时 需要加两个反斜杠(\[)进行转义识别,否则会误判的
  • 在iOS中的正则表达式字符串 不需要左右侧加 /
  1. NSRegularExpression 案例一. 在HTML字符串中 找寻出完整的 <img> 标签. 包含 /> 和 </img> 结尾两种情况
NSError *error;  
NSString *strRegex = @"<img([^<]+)(/>|</img>)";  
NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:strRegex options:NSRegularExpressionCaseInsensitive|NSRegularExpressionDotMatchesLineSeparators error:&error];  
//无视大小写.  
NSArray *matches = [reg matchesInString:@"所要查找的字符串" options:NSMatchingCompleted range:NSMakeRange(0, [muStrHTMLContent length])];  
for (NSTextCheckingResult *match in matches) {  
        i++;  
        NSRange range = [match range];  
        NSLog(@"%d,%d,%@",range.location,range.length,[muStrCloneHTMLContent substringWithRange:range]);  
}  
  1. NSRegularExpression 案例二. 对给定的字符串进行正则批量替换
NSError* error = NULL;  
//(encoding=\")[^\"]+(\")   
//分成三段来理解  
/* 
     第一段:以某段字符做为起始 (encoding=\") 括号内为实际内容 
     第二段:对于包含中的定义,参见正则. 
     第三段:再以某段字符做为收尾 (\") 
*/  
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(encoding=\")[^\"]+(\")"  
                                                                           options:0  
                                                                           error:&error];  
NSString* sample = @"<xml encoding=\"abc\"></xml><xml encoding=\"def\"></xml><xml encoding=\"ttt\"></xml>";  
NSLog(@"Start:%@",sample);  
//对给定的字符串进行正则批量替换. $1 表示 是否保留起始  $2 表示 是否保留收尾  
NSString* result = [regex stringByReplacingMatchesInString:sample  
                                                       options:0  
                                                       range:NSMakeRange(0, sample.length)  
                                                       withTemplate:@"$1余书懿$2"];  
NSLog(@"Result:%@", result);  
  1. 案例三: 补全 json 字符串中 没有 双引号的 key
NSError* error = nil;  
//(\\w+)(\\s*:\\s*)  
NSRegularExpression* regex = [NSRegularExpression             
                              regularExpressionWithPattern:@"(\\w+)(\\s*:\\s*)" options:0  error:&error];  
NSString* sample = @"{[{a:b,av:a},{a:a,s:a}]}";  
NSLog(@"Start:%@",sample);  
//对给定的字符串进行正则批量替换. $1  $2 表示检索到的部位 打印看结果  
NSString* result = [regex stringByReplacingMatchesInString:sample  
                                                   options:0  
                                                     range:NSMakeRange(0, sample.length)  
                                              withTemplate:@"\"$1\"$2"];  
NSLog(@"Result:%@", result);  
  1. 直接查找,不使用正则表达式类
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSRange range = [searchText rangeOfString:@"(?:[^,])*\\." <span style="background-color: #ffcc00;">options:NSRegularExpressionSearch</span>];
 
if (range.location != NSNotFound) {
    NSLog(@"%@", [searchText substringWithRange:range]);
}
  1. 使用正则表达式类
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";   
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^,])*\\." options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
    NSLog(@"%@\n", [searchText substringWithRange:result.range]);
}

一般的匹配,也就是说只关心第一个匹配的情况下,第一种方式更加简洁;
但是,如果需要匹配多个结果,同时匹配多次的情况下,第二种方式效率会更高

  1. 字符串替换
NSMutableString *mutableStr = [NSMutableString stringWithString:searchText];
[mutableStr replaceOccurrencesOfString:@"\ba\\w+" withString:@"XYZ" options:NSRegularExpressionSearch range:NSMakeRange(0, [mutableStr length])];
 
NSLog(@"replaced string: %@", mutableStr);

NSString是不能修改的,所以没有 replaceOccurrencesOfString 方法的

相关文章

网友评论

    本文标题:iOS中NSRegularExpression正则表达式的使用

    本文链接:https://www.haomeiwen.com/subject/ixbnrctx.html