4

文字列内の 2 つの文字を反転する必要があるという問題があります。たとえば、文字列が "a*b/c" で、* を / に、/ を * に置き換えたいとします。結果の文字列を「a/b*c」にしたい。

stringByReplacingOccurrenceOfString:最初の置換ラウンドが2番目の置換に影響を与えたくないため、このメソッドの使用は機能しません:

string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];

これは "a*b*c" になりますが、これは私が望むものではありません。これを達成する効率的な方法を知っている人はいますか?

4

4 に答える 4

4
string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"&"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];
[string stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
于 2013-08-07T18:15:26.670 に答える
2

を使用しNSScannerて文字列内を移動し、見つかった各文字を置き換えます。このように、すべての交代は 1 回のパスで行われ、ポジションを 2 回見ることはありません。

NSMutableString * fixedUpString = [NSMutableString string];
NSScanner * scanner = [NSScanner scannerWithString:origString];
NSCharacterSet * subCharacters = [NSCharacterSet characterSetWithCharactersInString:@"*/"];

while( ![scanner isAtEnd] ){

    // Pick up other characters.
    NSString * collector;
    if( [scanner scanUpToCharactersInSet:subCharacters intoString:&collector] ){
        [fixedUpString appendString:collector];
    }

    // This can easily be generalized with a loop over a mapping from
    // found characters to substitutions
    // Check which one we found
    if( [scanner scanString:@"*" intoString:nil] ){

        // Append the appropriate substitution.
        [fixedUpString appendString:@"/"];
    }
    else /* if( [scanner scanString:@"/" intoString:nil] ) */  {
        [fixedUpString appendString:@"*"];
    }
}

fixedUpString置換されたコンテンツが含まれるようになりました。

コメントで指摘したように、これは任意の数の置換に非常に簡単に一般化できます。

NSDictionary * substitutions = @{ @"a" : @"z", @"b" : @"y", ... };
NSCharacterSet * keyChars = [NSCharacterSet characterSetWithCharactersInString:[[substitutions allKeys] componentsJoinedByString:@""]];

...

// Check which one we found
for( NSString * keyChar in [substitutions allKeys] ){

    if( [scanner scanString:keyChar intoString:nil ){
        [fixedUpString appendString:substitutions[keyChar]];
        break;
    }
}
于 2013-08-07T18:26:39.377 に答える
1

私は中間の&文字を使用せずにこれを試してみる必要がありました.これは確かにより複雑ですが、これもうまくいくようです:

int main(int argc, char *argv[])
{

    NSString *s = @"1*2/3*4*5*6*7*8/2";

    NSArray *stars = [s componentsSeparatedByString:@"*"];
    NSMutableArray *slashes = [NSMutableArray array];
    for (NSString *star in stars)
    {
        [slashes addObject:[star componentsSeparatedByString:@"/"]];
    }

    NSMutableArray *newStars = [NSMutableArray array];
    for (NSArray *slash in slashes)
    {
        [newStars addObject:[slash componentsJoinedByString:@"*"]];
    }

    NSString *newString = [newStars componentsJoinedByString:@"/"];

    NSLog(@"%@", newString);

    return 0;
}

出力:

1/2*3/4/5/6/7/8*2

于 2013-08-07T18:26:43.593 に答える