2012-03-17 3 views
0

私はPHPのstrtrに似た文字置換を実行するために取り組んでいるNSStringカテゴリを持っています。このメソッドは文字列を取り、fromStringの各文字のすべての文字を置換し、同じインデックスを持つtoStringの文字で置き換えます。私は実用的な方法を持っていますが、パフォーマンスはあまり良くなく、より速く、メガバイトのデータを処理できるようにしたいと考えています。 (明確にするため)Objective-C NSString文字の置換

編集:

stringByReplacingOccurrencesOfString:withString:options:range:が動作しません。私は "ABC"のような文字列を取り、 "A"を "B"に、 "B"を "BAC"で "A"に置き換えなければなりません。 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; 
} 

また、このコードは、テキストビュー内のテキストを変更するたびに実行されます。毎回文字列全体が渡されます。私はそれを行うより良い方法があることを知っていますが、私はどのように分かっていません。これについての提案は、最も確かに評価されるでしょう!

答えて

0

NSRegularExpressionを使用して、このような文字列置換を行うと、変更可能な文字列を変更するか、新しい不変の文字列を作成することができます。 (たとえ2つ以上のシンボルであっても)2つの文字列で置き換えられますが、正規表現で何かを意味する文字(例えば\ [ (. * ? +など)をエスケープする必要があります。

パターンでは、2つの部分文字列のいずれかに、オプションの "anything"との間に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 
+0

非常に有望です。文字ごとの置換のためにそれを操作できるかどうかがわかります。 – TheCrypticAce

+0

私はキャラクターごとの交換が役に立たないようにするためにできることを試しました。助けがあれば、1文字は複数ではなく1つだけ置き換えられます。 – TheCrypticAce

+0

'fromString'を' firstString'、 'toString'を' secondString'とし、 'modifiedString'を返すことはできませんか?あなたの方法はまだ質問のように見えることを考えると。 –