2014-10-16 8 views
1

Я хочу заменить вхождения строк следующего формата на другие строки. Эта операция должна выполняться в цикле for.StringByReplacingOccurrencesOfString with options issue

Здесь fullString выглядит как этот

There are some other things ... Child_name_13 and Child_name_12  there are some other things ...... Child_name_1 some other things ... Child_name_12 some other things.. Child_name_6 some other things ... Child_name_7 

То, что я хочу сделать, это заменить «Child_name_1», «Child_name_12», «Child_name_7» и т.д. с соответствующими именами детей возвращается из arrOfChildren.

Мой подход заключается в следующем.

for(int i=0; i<[arrOfChildren count]; i++){ 
    NSString *strChildName = [[arrOf15Children objectAtIndex:i] objectForKey:@"Name"]; 

    fullString = [fullString stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"child_name_%d",i+1] withString:strChildName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [fullString length])]; 
} 

Этот вопрос, я получаю на выходе что-то вроде этого (Допустим, имена детей, как Бен, Рэнди, Амилом, Sanj, Павла, Марка, Ayen, Sid, Дон, Юн Синь Синь, Nik, Джек)

There are some other things ... Ben3 and Ben2  there are some other things ...... Ben some other things ... Ben2 some other things.. Mark some other things ... Ayen 

Но я хочу, чтобы это было как этот

There are some other things ...Nik and Xin there are some other things ...... Ben some other things ... Xin some other things.. Mark some other things ... Ayen 

Я надеюсь, вы получите этот вопрос.

+0

Проверьте мой ответ, он может выполнить лучше, чем регулярные выражения. –

ответ

0
  • Регулярное выражение решает вашу проблему, чтобы взять всю строку, которую мы должны использовать этот \\ bchild_name_% d \\ б

Проверяйте follwing код

NSArray *arrOfChildren = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", @"nine", @"ten", @"leven", @"twe", @"thirt", @"fourten", @"fiftee", nil]; 

NSString *fullString = @"Child_name_1 Child_name_2 Child_name_3 Child_name_4 Child_name_5 Child_name_6 Child_name_7 Child_name_8 Child_name_9 Child_name_10 Child_name_11 Child_name_12 Child_name_13 Child_name_14 Child_name_15 "; 

for(int i=0; i<[arrOfChildren count]; i++){ 
    NSString *strChildName = [arrOfChildren objectAtIndex:i]; 

    NSError *error = nil; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\bchild_name_%d\\b",i+1] options:NSRegularExpressionCaseInsensitive error:&error]; 

    fullString = [regex stringByReplacingMatchesInString:fullString options:0 range:NSMakeRange(0, [fullString length]) withTemplate:strChildName]; 

} 

NSLog(@"full stirng %@", fullString); 
  • inclue это в вашем коде

для (int i = 0; i < [arrOfChildren count]; я ++) {

NSString *strChildName = [[arrOf15Children objectAtIndex:i] objectForKey:@"Name"]; 

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\bchild_name_%d\\b",i+1] options:NSRegularExpressionCaseInsensitive error:&error]; 

fullString = [regex stringByReplacingMatchesInString:fullString options:0 range:NSMakeRange(0, [fullString length]) withTemplate:strChildName]; 

}

+0

Большое спасибо. работает отлично – sajaz

0

Соответствие по неизвестному количеству цифр даст вам несколько совпадений. «Child_name_10» имеет в нем «Child_name_1», поэтому, выполнив поиск «Child_name_1», вы получите несколько совпадений.

Вы можете сопоставить «Child_name_1» (пространство для заметок), но тогда вы должны помнить, что нужно добавить место для имени, которое вы заменяете. Или вы можете вставить начальные нули в строках «Child_name_x» (так «Child_name_01» вместо т.д. «Child_name_1»), а затем измените stringWithFormat на:

[NSString stringWithFormat:@"child_name_%02d",i+1] 

Если у вас есть более чем 99 детей, сделать то же самое, но для трех цифр (так что% 03d и «Child_name_001») и т. д.

+0

добавление нулей не решит проблему. потому что 'Child_name_01' и 'Child_name_010' снова будут одинаковыми ??? Нет ли стандартного способа сделать это, например, добавление некоторых параметров в критерии поиска ... – sajaz

+0

@sajaz с этим форматом будет «Child_name_10» не «Child_name_010». Ведущие нули включаются только в том случае, когда в номере недостаточно цифр. – Kegluneq

0

Вам нужно было изменить [NSString stringWithFormat: @ "child_name_% d", i + 1] с пустым пространством, вы можете отделить префиксные проблемы ,

0

Может NSRegularExpression может сделать вам пользу:

NSString *string = @"Child_name_1 and Child_name_13 are friends"; 
NSArray *nameArray = @[@"Tom", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"Jerry"]; 

for (int i = 0; i < [nameArray count]; i++) { 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\bChild_name_%d\\b", i + 1] options:0 error:nil]; 
    if (regex != nil) { 
     NSTextCheckingResult *firstMatch = [regex firstMatchInString:string options:0 range:NSMakeRange(0, string.length)]; 
     if (firstMatch) { 
      NSRange resultRange = [firstMatch rangeAtIndex:0]; 
      string = [string stringByReplacingCharactersInRange:resultRange withString:[nameArray objectAtIndex:i]]; 
     } 
    } 
} 

NSLog(@"result:%@", string); 

Также вы можете посмотреть на NSScanner :)

0

UPDATE:

только что сделал супер просто решение. Если вы знаете, что в строке не будет child_name с индексом больше, чем количество имен, которое у вас есть, т. Е. У вас есть 5 имен в вашем массиве имен, а в строке может быть максимальное имя_имя5, а имя child_name6 +, безусловно, отсутствует.

Вы просто инвертировать направление вы итерацию вам имена:

// only changed for statements, the rest is your code unchanged 
for(int i=[arrOfChildren count]-1; i>=0; i--){ 
    NSString *strChildName = [[arrOf15Children objectAtIndex:i] objectForKey:@"Name"]; 

    fullString = [fullString stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"child_name_%d",i+1] withString:strChildName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [fullString length])]; 
} 

Так вы замените все child_name15, то все child_name14 и так далее до child_name0.Вот как мы избалованы всеми этими мощными мощностями, мы забываем, как нужно кодировать.

Старый ответ:

Вам просто нужно регулярное выражение для этого. Вы найдете все совпадения и замените их на нужные имена. Пример регулярного выражения, которое может работать:

child_name[0-9]* 

Вы найдете все матчи, например, с помощью NSRegularExpression и заменить их соответствующими значениями, используя что-то другое. Другим решением может быть создание более сложного регулярного выражения с группами и использование их для достижения того, что вы хотите более элегантным способом.

0

Проблема связана с: [NSString stringWithFormat:@"child_name_%d",i+1]

потому Child_name_1 будет соответствовать Child_name_13.

Существуют различные решения этой проблемы.

1) Замена Multipass: Сначала замените элементы, соответствующие номерам, равным 10, а затем оставшимся.

for(int i=9; i<[arrOfChildren count]; i++){ 
    NSString *strChildName = [[arrOf15Children objectAtIndex:i] objectForKey:@"Name"]; 

    fullString = [fullString stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"child_name_%d",i+1] withString:strChildName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [fullString length])]; 
} 
for(int i=0; i<max(9,[arrOfChildren count]); i++){ 
    NSString *strChildName = [[arrOf15Children objectAtIndex:i] objectForKey:@"Name"]; 

    fullString = [fullString stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"child_name_%d",i+1] withString:strChildName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [fullString length])]; 
} 

2) Гораздо надежнее будет использовать регулярные выражения (NSRegularExpression) с выражением, как [...] expression = @"child_name_[0-9]+[^0-9]".

Регулярные выражения немного сложны, но инвестиции в их изучение дадут вам «сверхдержавы» на Stringhandling!

+0

спасибо за помощь. Я мог бы сделать это, используя регулярные выражения. – sajaz