У меня есть строка с тегами форматирования, например There are {adults} adults, and {children} children
. У меня есть словарь, в котором ключами являются «взрослые» и «дети», и мне нужно найти значение и заменить макросы на это значение. Это полностью динамично; ключи могут быть любыми (поэтому я не могу жестко кодировать stringByReplacingString
).
Раньше я делал подобные вещи раньше, просто просматривая изменчивую строку и ища символы; удаляя то, что я уже искал из исходной строки, как я иду. Похоже, это именно то, для чего предназначен NSScanner, поэтому я попробовал это:
NSScanner *scanner = [NSScanner scannerWithString:format];
NSString *foundString;
scanner.charactersToBeSkipped = nil;
NSMutableString *formatedResponse = [NSMutableString string];
while ([scanner scanUpToString:@"{" intoString:&foundString]) {
[formatedResponse appendString:[foundString stringByReplacingOccurrencesOfString:@"{" withString:@""]]; //Formatted string contains everything up to the {
[scanner scanUpToString:@"}" intoString:&foundString];
NSString *key = [foundString stringByReplacingOccurrencesOfString:@"}" withString:@""];
[formatedResponse appendString:[data objectForKey:key]];
}
NSRange range = [format rangeOfString:@"}" options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[formatedResponse appendString:[format substringFromIndex:range.location + 1]];
}
Проблема в том, что когда моя строка начинается с "{", сканер возвращает НЕТ вместо ДА. (Что и должно быть в документации) Так я неправильно использую NSScanner? Тот факт, что scanUpToString
не включает строку, которую искали как часть ее вывода, кажется, делает ее почти бесполезной ...
Может ли это быть легко изменено, чтобы делать то, что я хочу, или мне нужно переписать, используя изменяемую строку и поиск символов вручную?