初始化一个 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 是每个和表达式匹配好的字符串。
NSLog(@" str 1 is %@",str1);
}
获得匹配的字符串的个数
NSUInteger numberOfMatches = [regex numberOfMatchesInString:_str options:0 range:NSMakeRange(0, [_str length])];
替换匹配的字符串 $0很重要 $0不行的话 $1依此类推 打印了看结果
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
1: 如果在检索的文本中需要检索包含正则表达式的关键字,如 "[ ]" 那么在 拼装字符串时 需要加两个反斜杠(\\[)进行转义识别,否则会误判的
2: 在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]);
- }
2: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);
3:案例三: 补全 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]);
}
|
2、使用正则表达式类
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]);
}
|
一般的匹配,也就是说只关心第一个匹配的情况下,第一种方式更加简洁;
但是,如果需要匹配多个结果,同时匹配多次的情况下,第二种方式效率会更高
3、字符串替换
NSMutableString
*mutableStr = [
NSMutableString
stringWithString:searchText];
[mutableStr replaceOccurrencesOfString:@
"\ba\\w+"
withString:@
"XYZ"
options:
NSRegularExpressionSearch
range:
NSMakeRange
(0, [mutableStr length])];
NSLog
(@
"replaced string: %@"
, mutableStr);
|
NSString是不能修改的,所以没有 replaceOccurrencesOfString 方法的