正則表達式在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}]為中文字符范圍
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容