Разбор строки в разделах с помощью NSScanner - PullRequest
0 голосов
/ 05 июля 2011

Я пытаюсь проанализировать строку в таком формате:

*date1:
- band1.1 @ venue1.1.
- band1.2 @ venue1.2.
*date2:
- band 2.1 @ venue2.1.
- band 2.2 @ venue2.2.

и т. Д.

Количество дат и количество бэндов и связанного места могут отличаться.Я использую код на основе примера внизу этой страницы .

Я использую этот фрагмент кода (я пропустил биты внизу, поскольку они не имеют значения, но даЯ закрываю циклы и т. Д.):

 NSScanner *scanner1 = [NSScanner scannerWithString:contents];
NSCharacterSet *colon = [NSCharacterSet characterSetWithCharactersInString:@":"];
NSCharacterSet *at = [NSCharacterSet characterSetWithCharactersInString:@"@"];
NSCharacterSet *dot = [NSCharacterSet characterSetWithCharactersInString:@"."];
NSLog(@"scanner starting");

while ([scanner1 isAtEnd] == NO) {
    if ([scanner1 scanString:@"*" intoString:NULL] && [scanner1 scanUpToCharactersFromSet:colon intoString:&tempDate] && [scanner1 scanString:@":" intoString:NULL]) 
    {
        NSLog(@"%@", tempDate);
        if ([scanner1 scanString:@"-" intoString:NULL] && [scanner1 scanUpToCharactersFromSet:at intoString:&tempBands] && [scanner1 scanString:@"@" intoString:NULL] && [scanner1 scanUpToCharactersFromSet:dot intoString:&tempVenue]
            &&[scanner1 scanString:@"." intoString:NULL]) 
        {
            NSLog(@"%@ %@", tempBands, tempVenue);
        }
    }
}   NSLog(@"ended scanning"); 

В настоящее время первая дата анализируется и выводится на консоль, а первое место и группа этой даты печатаются.«Законченное сканирование» никогда не печатается.Я боролся с этим часами, и я не уверен, что делать сейчас.У меня есть ощущение, что я не понимаю внутреннюю работу NSScanner, и, вероятно, есть другой способ решения этой проблемы.Может мне нужен второй сканер?

1 Ответ

1 голос
/ 05 июля 2011

После первого раунда цикла while положение сканера сразу после "venue1.".Следующий раунд цикла начинается со сканирования звездочки, которая завершается неудачно (возвращает НЕТ), потому что следующий (не пробельный) символ - это тире.Следовательно, тело оператора if не выполняется, и позиция сканера не продвигается дальше, что приводит к бесконечному циклу.

...