2013-10-09 4 views
-2

У меня есть NSString, как @"12345", а другой - @"##-##-#". Каков наилучший способ заменить все символы # в NSString по одному, чтобы он выглядел как 12-34-5?Заменить символы в одном NSString на символы из другого NSString

+0

@nhgrif Итерация через '' NSString' с substringWithRange: NSMakeRange (0 , 2)]; 'но это требует, чтобы я знал точное количество символов, что не удобно. –

+0

Вы посмотрели документацию для NSString ??? –

+0

@HotLicks да, сэр и что именно я пропустил? –

ответ

2
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; 
     } 
    } 
} 
+0

Возвращаемое значение 'characterAtIndex:' не 'char', это' unichar'. Большая разница. И почему вы используете вложенные циклы? Там должен быть только один цикл. – rmaddy

+0

Код работает, я тестировал его ... Извините, если он быстрый и грязный. – davecom

+0

Он работает только в том случае, если исходная строка содержит символы в ограниченном диапазоне, а ваш код ужасно неэффективен. – rmaddy

0

Решение с одним витком:

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); 
0

К сожалению, я неправильно понял ваш вопрос:

Вот рабочее решение, которое я испытал.

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); 
0

Вот моя попытка на этом, одном цикле и без применения тяжелой 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

Смежные вопросы