0

PHPのstrtrに似た文字置換を実行するために取り組んでいるNSStringカテゴリがあります。このメソッドは、文字列を受け取り、各文字が出現するたびに置き換え、同じインデックスを持つfromString文字に置き換えます。toString私は作業方法を持っていますが、それはあまりパフォーマンスが高くなく、より速く、メガバイトのデータを処理できるようにしたいと考えています.

編集(わかりやすくするために):

stringByReplacingOccurrencesOfString:withString:options:range:動作しないでしょう。「ABC」のような文字列を取得する必要があり、「A」を「B」に、「B」を「A」に置き換えた後、「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を使用して、この種の文字列置換を、可変文字列を変更するか、新しい不変文字列を作成することで行うことができます。置換する任意の2つの文字列で機能しますが(複数の記号であっても)、正規表現で何かを意味する文字(\ [ ( . * ? +など)をエスケープする必要があります。

このパターンは、間にオプションの「anything」がある2つのサブ文字列のいずれかを検出し、それらを2つのサブ文字列に置き換えて、それらの間にオプションの文字列を保持します。

// 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 に答える