0

我有一个 NSString 类别,我正在处理类似于 PHP 的 strtr 的字符替换。此方法接受一个字符串并替换每个出现的字符 infromString并将其替换为具有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;
}

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

4

1 回答 1

0

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

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

// 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
于 2012-04-04T09:12:14.230 回答