Использование NSScanner для синтаксического анализа строки

У меня есть строка с тегами форматирования, например Есть {взрослые} взрослые и {дети} дети . У меня есть словарь, в котором в качестве ключей есть «взрослые» и «дети», и мне нужно найти значение и заменить макросы этим значением. Это полностью динамично; ключи могут быть любыми (поэтому я не могу жестко закодировать 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]];
}

Проблема в том, что когда моя строка начинается с "{", сканер возвращает NO вместо YES. (Это должно произойти в документации). Так я неправильно использую NSScanner? Тот факт, что scanUpToString не включает строку, которая искалась как часть его вывода, кажется, делает его почти бесполезным ...

Можно ли это легко изменить, чтобы делать то, что я хочу, или мне нужно переписать, используя изменяемую строку и поиск символов вручную?

6
задан GendoIkari 22 March 2011 в 18:35
поделиться