正则表达式在iOS项目的应用

iOS正规表达式NSRegularExpression支持单行模式和多行模式、支持非贪婪模式

案例01:支持非贪婪模式
NSString *search = @"abccccccc";
        
//贪婪@"abc+" 匹配到"abccccccc"
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"abc+" options:0 error:&error];
        
//非贪婪@"abc+?" 匹配到"abc"
NSRegularExpression *regex2 = [NSRegularExpression regularExpressionWithPattern:@"abc+?" options:0 error:NULL];

案例02:支持正前瞻(?=...)
NSString *searchText = @"abcdabc9";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"abc(?=d)" options:0 error:NULL];
id result = [regex matchesInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
NSLog(@"%@",result);
//输出:(
    "<NSSimpleRegularExpressionCheckingResult: 0x600000f638c0>{0, 3}{<NSRegularExpression: 0x60000146c4b0> abc(?=d) 0x0}"
)
//匹配的范围为:{0, 3} 第1个:abc

案例03:支持反前瞻(?!...)
NSString *searchText = @"abcdabc9";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"abc(?!d)" options:0 error:NULL];
id result = [regex matchesInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
NSLog(@"%@",result);
//输出:(
    "<NSSimpleRegularExpressionCheckingResult: 0x60000118c200>{4, 3}{<NSRegularExpression: 0x600000a98180> abc(?!d) 0x0}"
)
//匹配的范围为:{4, 3} 第2个:abc

案例04:支持正后顾(?<=...)
NSString *searchText = @"abcdabc9";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=d)abc" options:0 error:NULL];
id result = [regex matchesInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
NSLog(@"%@",result);
//输出:(
    "<NSSimpleRegularExpressionCheckingResult: 0x600003cec280>{4, 3}{<NSRegularExpression: 0x6000027cdb00> (?<=d)abc 0x0}"
)
//匹配的范围为:{4, 3} 第2个:abc

案例05:支持反后顾(?<!...)
NSString *searchText = @"abcdabc9";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<!d)abc" options:0 error:NULL];
id result = [regex matchesInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
NSLog(@"%@",result);
//输出:(
    "<NSSimpleRegularExpressionCheckingResult: 0x600001e15dc0>{0, 3}{<NSRegularExpression: 0x600000523540> (?<!d)abc 0x0}"
)
//匹配的范围为:{0, 3} 第1个:abc

Xcode支持正则查找和正则替换

应用1

像objectAtIndex旧语法可能会有告警,用正则查找替换加快效率:

objectAtIndex旧语法替换.png
正则查找:
\[(\s*)([^\[]+)(\s+)objectAtIndex(\s*):(\s*)([^\]]+)\]

正则替换:
$2\[$6\]

我们工程实践正确率98%,此类型替换错误:

aLine = (__bridge CTLineRef)[(__bridge NSArray *)(firstLines) objectAtIndex:j];
aLine = (__bridge CTLineRef)(__bridge NSArray *)(firstLines)[j];

应用2

[NSArray count]替换为NSArray.count

正则查找:
\[(\s*)([^\[]+)(\s+)count(\s*)\]

正则替换:
$2.count

应用3

为多国语,在项目中查找字符串
我们项目中如下的语句:

DDLogVerbose(@"接收到服务器的数据%@", data);
NSLog(@"包含中文的字符串");```
这些语句中的字符串不需要多国语化,可用如下的正则表达式来排除:
正则查找:
```(?<!(//.{0,200})|(DDLogVerbose\()|(NSLog\())@"([\x{4e00}-\x{9fa5}]+)([^"]*)"```

注意:这个正则不能提取非中文开头但含中文的字符串
注意:Xcode在(?<!)中好像不支持使用*元字符,所以只好变通下,用{0,200}来模拟*,这里200是随便取的,只要大一点就好
注意:[\x{4e00}-\x{9fa5}]为中文字符范围
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容