首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字符串中将两个字符的出现替换为彼此

在字符串中将两个字符的出现替换为彼此
EN

Stack Overflow用户
提问于 2013-08-07 18:13:19
回答 4查看 971关注 0票数 4

我遇到了一个问题,我需要在字符串中倒置两个字符。例如,如果我的字符串是"a * b/c“,并且我希望用/ and / with *替换出现的*。我希望得到的字符串是"a/b*c“。

使用stringByReplacingOccurrenceOfString:方法不起作用,因为我不希望第一轮替换影响第二轮:

代码语言:javascript
复制
string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];

这就产生了"a*b*c",这不是我想要的。有没有人知道一个有效的方法来实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-07 18:15:26

代码语言:javascript
复制
string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"&"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];
[string stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
票数 4
EN

Stack Overflow用户

发布于 2013-08-07 18:26:39

使用NSScanner在字符串中移动,并在找到每个字符时替换它。这样,所有的换人都是在一次传球中完成的,你永远不会两次看到一个位置。

代码语言:javascript
复制
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现在包含替代的内容。

正如我在评论中所指出的,这可以很容易地推广到任意数量的替换:

代码语言:javascript
复制
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;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-07 18:26:43

在不使用中间&字符的情况下,我不得不尝试这样做,虽然这当然更复杂,但这似乎也有效:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18110696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档