【问题标题】:Replace characters in one NSString to characters from another NSString [closed]将一个 NSString 中的字符替换为另一个 NSString 中的字符 [关闭]
【发布时间】:2013-10-09 17:05:54
【问题描述】:

我有一个NSString 像@"12345" 和另一个像@"##-##-#"。将NSString 中的所有# 字符一一替换,使其看起来像12-34-5 的最佳方法是什么?

【问题讨论】:

  • @nhgrif 用substringWithRange:NSMakeRange(0, 2)]; 遍历NSString 但它需要我知道确切的字符数,这不方便。
  • 你看过 NSString 的文档了吗???
  • @HotLicks 是的,先生,我到底错过了什么?
  • 好吧,让我们看看:componentsSeparatedByString、rangeOfString,当然还有旧的 characterAtIndex。
  • @HotLicks 但是我应该如何以这种方式遍历字符串呢?字符串 1 和字符串 2 可能因不同的 .length 和其他内容而有所不同。

标签: objective-c cocoa-touch nsstring


【解决方案1】:
NSString *original = @"12345";
NSString *toRepl = @"##-##-#";
for (int i = 0; i < original.length; i++) {
    unichar c = [original characterAtIndex:i];
    for (int j = 0; j < toRepl.length; j++) {
        if([toRepl characterAtIndex:j] == '#'){
            toRepl = [toRepl stringByReplacingCharactersInRange:NSMakeRange(j, 1) withString:[NSString stringWithFormat:@"%c", c]];
            break;
        }
    }
}

【讨论】:

  • characterAtIndex:的返回值不是char,而是unichar。巨大差距。为什么要使用嵌套循环?应该只有一个循环。
  • 代码有效,我测试过了...对不起,如果它又快又脏。
  • 只有当原始字符串的字符在有限范围内并且您的代码效率极低时才有效。
  • 我不是想赢得效率奖...与其只是批评,不如向我们展示正确的方式如何?当然,使用其他一些 NSString 方法可以更快地完成,例如 replaceFirstOccurenceOfString: withString:
  • 为了以后的注意,参考代码而不是人会更有礼貌。比如“那个代码效率很低”而不是“你的代码效率极低”......干杯。
【解决方案2】:

单循环解决方案:

NSString *pattern = @"##-##-#";
NSString *fillWith = @"12345";

NSMutableString *result = [pattern mutableCopy];
__block NSUInteger index = 0; // Position into fillWith

// Loop over all characters in pattern:
[pattern enumerateSubstringsInRange:NSMakeRange(0, [pattern length])
                            options:NSStringEnumerationByComposedCharacterSequences
                         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
     if ([substring isEqualToString:@"#"]) {
         if (index < [fillWith length]) {
             // Replace # by the next character from fillWith:
             [result replaceCharactersInRange:substringRange
                                   withString:[fillWith substringWithRange:NSMakeRange(index, 1)]];
             index++;
         } else {
             // Too many #'s in pattern:
             *stop = YES;
         }
     }
}];
NSLog(@"%@", result);

【讨论】:

    【解决方案3】:

    对不起,我看错了你的问题:

    这是我测试过的有效解决方案。

    NSString *string = @"123456";
    
    NSString *string2 = @"##-##-##";
    
    int i = 0;
    do {
        NSRange rangeOfChar = [string2 rangeOfString:@"-"];
    
        NSLog(@"range %ld %ld",rangeOfChar.location,rangeOfChar.length);
    
        string = [NSString stringWithFormat:@"%@%@%@",[string substringToIndex:rangeOfChar.location+i],@"-",[string substringFromIndex:rangeOfChar.location+i]];
    
    
        string2 = [string2 stringByReplacingCharactersInRange:rangeOfChar withString:@""];
    
        i++;
    
    } while ([string2 rangeOfString:@"-"].location!=NSNotFound);
    

    【讨论】:

      【解决方案4】:

      这是我的尝试,单循环,不使用繁重的characterAtIndex:

      NSString *pattern = @"##-##-#";
      NSString *replace = @"12345";
      NSMutableString *result = [pattern mutableCopy];
      NSRange searchRange = NSMakeRange(0, [pattern length]);
      NSRange resultRange;
      
      NSString *patternCheck = [pattern stringByReplacingOccurrencesOfString:@"-" withString:@""];
      
      if ([replace length] == [patternCheck length]) {
          for (int i = 0; i < [replace length]; i++) {
              resultRange = [result rangeOfString:@"#" options:NSCaseInsensitiveSearch range:searchRange];
              [result replaceCharactersInRange:resultRange withString:[replace substringWithRange:NSMakeRange(i, 1)]];
          }
      }
      NSLog(@"pattern:%@ replace:%@ result:%@", pattern, replace, result);
      

      将打印pattern:##-##-# replace:12345 result:12-34-5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 2013-10-19
        • 1970-01-01
        • 2012-01-26
        • 2012-12-15
        相关资源
        最近更新 更多