【问题标题】:Replace using regular expression with replacement function使用正则表达式替换替换函数
【发布时间】:2014-06-01 11:20:14
【问题描述】:

在objective-c(用于ios)中,我想达到与AS3相同的效果:

var test:String = "Abba";
var reg:RegExp = /(a)|(b)/g;

var replacement:Function = function (...args):String
{
    var $1:String = args[1];//matched 'a'
    var $2:String = args[2];//matched 'b'
    if($1)
    {
        //replace a with -
        return "-";
    }
    if ($2)
    {
        //replace b with +
        return "+";
    }
    return null;
}

var result:String = test.replace(reg, replacement);//A++-
trace(test, result);//Abba A++-

换句话说,我希望能够识别匹配哪个捕获组并相应地替换它,我正在寻找有关 enumerateMatchesInString 的示例:但找不到任何可以解决我的问题的东西。

【问题讨论】:

    标签: ios objective-c regex replace nsregularexpression


    【解决方案1】:

    enumerateMatchesInString: 为每个匹配调用一个带有NSTextCheckingResult 的块, rangeAtIndex:idx 给出了捕获的子组的范围:

    NSString *string = @"Abba";
    NSString *pattern = @"(a)|(b)";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                           options:0
                                         error:NULL];
    
    NSMutableString *newString = [string mutableCopy];
    [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
                 usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                     NSRange r1 = [result rangeAtIndex:1];
                     if (r1.location != NSNotFound) {
                         [newString replaceCharactersInRange:r1 withString:@"-"];
                     }
                     NSRange r2 = [result rangeAtIndex:2];
                     if (r2.location != NSNotFound) {
                         [newString replaceCharactersInRange:r2 withString:@"+"];
                     }
                 }];
    NSLog(@"%@", newString);
    // Output: A++-
    

    如果替换字符串的长度与原始字符串不同,则 稍微复杂一些,因为您必须跟踪长度变化 在结果字符串中:

    NSMutableString *newString = [string mutableCopy];
    __block int offset = 0;
    [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
                 usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                     NSRange r1 = [result rangeAtIndex:1];
                     if (r1.location != NSNotFound) {
                         r1.location += offset;
                         NSString *repl = @"---";
                         [newString replaceCharactersInRange:r1 withString:repl];
                         offset += [repl length] - r1.length;
                     }
                     NSRange r2 = [result rangeAtIndex:2];
                     if (r2.location != NSNotFound) {
                         r2.location += offset;
                         NSString *repl = @"++";
                         [newString replaceCharactersInRange:r2 withString:repl];
                         offset += [repl length] - r2.length;
                     }
                 }];
    NSLog(@"%@", newString);
    // Output: A++++---
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多