OC语言实现类似PHP的preg_replace_callbac
2021-02-23 本文已影响0人
鸿雁长飞光不度
php里面的preg_replace_callback函数可以在正则替换的时候,通过自定义的函数对匹配的结果进行自定义函数处理,然后在替换,OC语言没有提供这个函数,需要自己实现,OC的正则相关内容网上实在太少,搜了半天都没有搜索到合适的,还有不少直接是复制粘贴别人的。
+(NSString *) regexReplaceString:(NSString *) subject withPattern:(NSString *) pattern withCallBack:(NSString *(^__nullable)(NSTextCheckingResult * result, NSString * match)) block
{
NSError* error = NULL;
NSRegularExpression* regex = [NSRegularExpression
regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:&error];
NSMutableString* mutableString = [subject mutableCopy];
NSInteger offset = 0;
for (NSTextCheckingResult* result in [regex matchesInString:subject
options:0
range:NSMakeRange(0, [subject length])]) {
NSRange resultRange = [result range];
resultRange.location += offset;
NSString* match = [regex replacementStringForResult:result
inString:mutableString
offset:offset
template:@"$0"];
NSTextCheckingResult * subResult = [regex firstMatchInString:match options:0 range:NSMakeRange(0, [match length])];
NSString * replacement = match;
if (block != nil) {
replacement = block(subResult,match);
}
// make the replacement
[mutableString replaceCharactersInRange:resultRange withString:replacement];
// update the offset based on the replacement
offset += ([replacement length] - resultRange.length);
}
return mutableString;
}
测试案例
NSString * string = [Tool regexReplaceString:@"电话号码:010-123456" withPattern:@"(\\d+)\\-(\\d+)" withCallBack:^NSString * _Nonnull(NSTextCheckingResult * _Nonnull result, NSString * _Nonnull match) {
return [NSString stringWithFormat:@"区号:%@ 号码是:%@",
[match substringWithRange:[result rangeAtIndex:1]],
[match substringWithRange:[result rangeAtIndex:2]]
];
}];
NSLog(@"%@",string);
输出结果: 电话号码:区号:010 号码是:123456