簡體   English   中英

使用帶有替換功能的正則表達式進行替換

[英]Replace using regular expression with replacement function

在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的示例:但找不到能解決我的問題的任何東西。

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++++---

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM