我遇到了一个问题,我需要在字符串中倒置两个字符。例如,如果我的字符串是"a * b/c“,并且我希望用/ and / with *替换出现的*。我希望得到的字符串是"a/b*c“。
使用stringByReplacingOccurrenceOfString:方法不起作用,因为我不希望第一轮替换影响第二轮:
string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];这就产生了"a*b*c",这不是我想要的。有没有人知道一个有效的方法来实现这一点?
发布于 2013-08-07 18:15:26
string = @"a*b/c";
[string stringByReplacingOccurrencesOfString:@"*" withString:@"&"];
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"];
[string stringByReplacingOccurrencesOfString:@"&" withString:@"/"];发布于 2013-08-07 18:26:39
使用NSScanner在字符串中移动,并在找到每个字符时替换它。这样,所有的换人都是在一次传球中完成的,你永远不会两次看到一个位置。
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-07 18:26:43
在不使用中间&字符的情况下,我不得不尝试这样做,虽然这当然更复杂,但这似乎也有效:
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
https://stackoverflow.com/questions/18110696
复制相似问题