0

我正在尝试解析格式如下的字符串:

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

ETC

日期的数量和乐队的数量以及相关的场地可能会有所不同。我正在使用基于本页底部示例的代码。

我正在使用这段代码(我省略了底部的位,因为它们无关紧要,但是是的,我确实关闭了循环等):

 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 的内部工作原理,并且可能有不同的方法来解决这个问题。也许我需要第二台扫描仪?

4

1 回答 1

1

After the first round of the while loop, the scanner's position is right after "venue1.". The next round of the loop starts with scanning an asterisk, which fails (returns NO) because the next (non-whitespace) character is a dash. Therefore, the body of the if statement isn't executed and the scanner's position is not advanced any further, resulting in an infinite loop.

于 2011-07-05T02:38:45.370 回答