【问题标题】:Objective-C NSString character substitutionObjective-C NSString 字符替换
【发布时间】:2012-03-17 14:26:39
【问题描述】:

我正在处理一个 NSString 类别来执行类似于 PHP 的 strtr 的字符替换。此方法接受一个字符串并替换fromString 中每个字符的每次出现,并将其替换为toString 中具有相同索引的字符。我有一个工作方法,但它的性能不是很好,我想让它更快并能够处理兆字节的数据。

编辑(为清楚起见):

stringByReplacingOccurrencesOfString:withString:options:range: 将不起作用。我必须取一个像“ABC”这样的字符串,在用“B”替换“A”和用“A”替换“B”后,最终得到“BAC”。连续调用stringByReplacingOccurrencesOfString:withString:options:range: 会生成一个类似于“AAC”的字符串,这是不正确的。

建议会很棒,示例代码会更好!

代码:

- (NSString *)stringBySubstitutingCharactersFromString:(NSString *)fromString
                                              toString:(NSString *)toString;
{
    NSMutableString *substitutedString = [self mutableCopy];
    NSString *aCharacterString;

    NSUInteger  characterIndex
    ,           stringLength = substitutedString.length;

    for (NSUInteger i = 0; i < stringLength; ++i) {
        aCharacterString = [NSString stringWithFormat: @"%C", [substitutedString characterAtIndex:i]];
        characterIndex = [fromString rangeOfString:aCharacterString].location;

        if (characterIndex == NSNotFound) continue;

        [substitutedString replaceCharactersInRange:NSMakeRange(i, 1)
                                     withString:[NSString stringWithFormat:@"%C", [toString characterAtIndex:characterIndex]]];
    }

    return substitutedString;
}

在文本视图中每次更改文本后都会执行此代码。每次都传递整个字符串。我知道有更好的方法可以做到这一点,但我不知道怎么做。对此的任何建议都将不胜感激!

【问题讨论】:

    标签: objective-c string character substitution strtr


    【解决方案1】:

    您可以使用NSRegularExpression 进行这种字符串替换,修改可变字符串或创建新的不可变字符串。它可以与任意两个字符串一起替换(即使它们不止一个符号),但您需要转义任何在正则表达式中表示某种含义的字符(如\ [ ( . * ? + 等)。

    该模式找到两个子字符串中的任何一个,其间有可选的“任何东西”,然后用两个子字符串替换它们,彼此保留它们之间的可选字符串。

    // These string can be of any length
    NSString *firstString = @"Axa";
    NSString *secondString = @"By";   
    // Escaping of characters used in regular expressions has NOT been done here     
    NSString *pattern = [NSString stringWithFormat:@"(%@|%@)(.*?)(%@|%@)", firstString, secondString, firstString, secondString];
    
    NSString *string = @"AxaByCAxaCBy";
    
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    if (error) {
        // Insert error handling here...
    }
    
    NSString *modifiedString = [regex stringByReplacingMatchesInString:string
                                                               options:0
                                                                 range:NSMakeRange(0, [string length])
                                                          withTemplate:@"$3$2$1"];
    
    
    NSLog(@"Before:\t%@", string);           // AxaByCAxaCBy
    NSLog(@"After:  \t%@", modifiedString);  // ByAxaCByCAxa
    

    【讨论】:

    • 看起来很有希望。我会看看我是否可以操作它进行逐个字符的替换。
    • 我尽我所能使它适用于逐个字符的替换,但无济于事。如果有帮助,一个字符将被替换为一个,而不是多个。
    • 难道不能让fromString 成为firstStringtoString 成为secondString 并返回modifiedString?鉴于您的方法看起来仍然像问题中那样。
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多