NSScanner扫描直到字符或数字命中

时间:2014-09-12 08:05:18

标签: ios objective-c

我的问题是我想从字符串中提取数据。字符串打印1000行,从web获取一些随机数据。字符串是这样的:

Level

 1 

 2 

 3 

 4 

 5 

 6 

 7 

 8 


 Score 

 0 

 0 

 0 

 0 

 0 

 0 

 0 

 0

我需要NSScanner将数据保存在数组中

int * extractedLevelData = {1,2,3,4,5,6,7,8} int * extractedScoreData = {0,0,0,0,0,0,0}

问题在于级别和分数中的行数是动态的,它从1然后是新行然后是2然后是新行然后是3然后是新行,依此类推。挑战在于,有时它可以是1到5或有时它可以只有1,有时最大值是1到8.它们显示的风格与上面显示的相同,然后是新的线条字符。与"得分相同"。

我已经尝试了这个但是保存的数据在NSLog中返回null,自从我学习Objective C以来已经过了7天,我几乎已经完成了应用程序,直到出现此问题。< / p>

以下是我尝试的内容:

NSString *extractedData;

NSCharacterSet *tripleNewLine = [NSCharacterSet characterSetWithCharactersInString:@"\n\n\n"];

[firstScanner scanString:@"Level" intoString:NULL];
[firstScanner setScanLocation:[firstScanner scanLocation]];
[firstScanner scanUpToCharactersFromSet:tripleNewLine intoString:&extractedData];

NSLog(@"%@", extractedData);

请注意,这只是一个代码片段,真正的问题非常复杂,但如果有人足够智能解决这个问题,那么我的问题就会解决!逻辑可以是:告诉NSScanner从&#34; Level&#34;带有数字的文本,直到它击中任何字符。

2 个答案:

答案 0 :(得分:0)

因此,如果您真的不想使用NSScanner,则可以使用以下其他解决方案:

将整个字符串拆分为Score这将为您提供两个字符串,其中一个包含得分值,另一个包含来自级别的值:

 `NSArray *components = [serverString componentsSeparatedByString:@"Score"];`

上面的行会将服务器字符串拆分为components数组包含的两个字符串。一个将包含来自Level 的所有值,包括级别,另一个将具有Score 的值,而不包含分数值

现在你可以用\n字符分割这两个字符串,这将导致两个数组包含一行中的所有值。

if(components.count > 1) {   //we better check if we have both substrings
    NSArray *levels = [[components objectAtIndex:0] componentsSeparatedByString:@"\n"];
    NSArray *scores = [[components objectAtIndex:1] componentsSeparatedByString:@"\n"];
}

现在你拥有了所有的值后我们应该创建一个方法来检查一个值是否是一个实际的数字,否则我们将把它从数组中删除。

 -(NSArray *)checkAndRemoveNonNumbersFromArray:(NSArray *)checkedArray {
           NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
            checkedArray = [checkedArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
                NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:evaluatedObject];
                return [alphaNums isSupersetOfSet:inStringSet];
            }]];
            return checkedArray;
        }

现在我们已经创建了方法,第2点的代码将成为:

if(components.count > 1) {   //we better check if we have both substrings
        NSArray *levels = [[components objectAtIndex:0] componentsSeparatedByString:@"\n"];
        NSArray *scores = [[components objectAtIndex:1] componentsSeparatedByString:@"\n"];
        levels = [self checkAndRemoveNonNumbersFromArray:levels];
        scores = [self checkAndRemoveNonNumbersFromArray:scores];
    }

现在水平&amp;分数只有这两个数组的数值。注意,这不是最好的解决方案,更多的解决方案向您展示如何使用字符串,在您了解此实现之后我认为您可以找到使用NSScaner的方法。

答案 1 :(得分:0)

我看到你传递 @“Level”作为字符串输入而不是变量,这是不正确的。我假设 Level 在这种情况下是NSString对象。您可以使用此解决方案。这将打印来自 Level

的所有数据
  

NSScanner * scanner = [NSScanner scannerWithString:Level];

     

while([scanner isAtEnd] == NO){

  [scanner setScanLocation:[scanner scanLocation]];
  [scanner scanUpToCharactersFromSet:tripleNewLine intoString:&extractedData];
  NSLog(@"%@", extractedData);
     

}