1

假设我有一个字符串(“G00 X0.0000 Y0.0000”),我需要解析它的内容。这是我的代码:

NSCharacterSet *params = [NSCharacterSet characterSetWithCharactersInString:@"XY"];

//setup the scanner
NSScanner *scanner = [NSScanner scannerWithString:stringToBeScanned];
NSString *scanned = nil;

//scan the string
NSLog(@"%@", stringToBeScanned);
while ([scanner scanUpToCharactersFromSet:params intoString:&scanned]) {

    struct keypair code;
    code.key = [scanned characterAtIndex:0];
    code.value = [[scanned substringFromIndex:1] doubleValue];

    NSLog(@"--> %@ [%lu]= (%c, %.4f)", scanned, [scanner scanLocation], code.key, code.value);
}

以及 NSLog 的输出:

G00 X0.0000 Y0.0000 
--> G00  [4]= (G, 0.0000)

我的字符集包括“X”和“Y”,我不知道为什么我的 NSScanner 不会在“X0.0000”中扫描 - 它应该找到 Y 并根据我的从 X 到 Y 提取所有内容理解。

我可以从 scanLocation 看到扫描仪在索引 4 处停止(正确),但循环要么不继续,要么评估为假。扫描仪不应该继续循环并找到我的分隔符(从字符集中)并获取数据吗?

4

2 回答 2

0

我解决了这个问题。基本上,我收到一个带有“代码”列表的字符串,后跟与该命令/参数关联的值。每个字符串中可能有几个不同的“命令”,或者根本没有。关键是使用 scanCharactersFromSet: 和 scanUpToCharactersFromSet: 来捕获正确的配对并解析整个字符串,同时保持非常灵活。这有点难看,我知道。

这是我的代码:

//setup the scanner
NSScanner *scanner = [NSScanner scannerWithString:[self stringByAppendingString:@"!"]];
NSCharacterSet *codeset = [NSCharacterSet characterSetWithCharactersInString:@"GMTFIJKPRSXYZ!"];
NSString *scanned = nil;
char codechar;

//perform the first scan
[scanner scanCharactersFromSet:codeset intoString:&scanned];
if (scanned)
    codechar = [scanned characterAtIndex:0];

//scan the string
while ([scanner scanUpToCharactersFromSet:codeset intoString:&scanned]) {
    struct keypair code;
    code.key = codechar;
    code.value = [scanned doubleValue];

    NSLog(@"--> (%c, %.4f)", code.key, code.value);

    //skip over the delimeter we encountered
    [scanner scanCharactersFromSet:codeset intoString:&scanned];
    if (scanned)
        codechar = [scanned characterAtIndex:0];

}
于 2012-09-13T00:25:41.087 回答
0

scanUpToCharactersFromSet:intoString:扫描“X”并为您提供它扫描的字符“G00”。

请注意,它不会扫描“X”。当您再次调用该方法时,它会查看下一个字符(“X”),注意到它是集合中的一个字符,然后停止扫描。因为它没有扫描任何字符,所以它返回NO.

要扫描“X”(或“Y”),您也需要使用scanCharactersFromSet:intoString:

于 2012-09-12T06:40:42.727 回答