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
上一篇 下一篇

猜你喜欢

热点阅读