2012-09-12 2 views
1

Предположим, у меня есть строка («G00 X0.0000 Y0.0000»), и мне нужно проанализировать ее содержимое. Вот мой код:Еще один символ NSScannerSetWithCharactersInString newb

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) 

Мой CharacterSet включает в себя как «X» и «Y», и я не могу понять, почему мой NSScanner не будет сканировать в «X0.0000» - он должен найти, что Y и тянуть во всем от X до Y согласно моему пониманию.

Из области сканирования видно, что сканер останавливается на индексе 4 (правильно), но цикл либо не продолжается, либо не принимает значение false. Разве сканер не должен зацикливаться и находить мои разделители (из набора символов) и захватывать данные?

ответ

0

scanUpToCharactersFromSet:intoString: сканирует до «X» и дает вам персонажи, которые он сканировал «G00».

Обратите внимание, что он не сканирует «X». Когда вы снова вызываете метод, он смотрит на следующий символ («X»), замечает, что он является символом в наборе и прекращает сканирование. Поскольку он не сканировал никаких символов, он возвращает NO.

Чтобы отсканировать «X» (или «Y»), вы также захотите использовать scanCharactersFromSet:intoString:.

+0

о. вы говорите, что для продолжения сканирования этой строки и прохождения через x (scanUpTo: «Y») - мне нужно будет удалить «X» из набора символов? хм ... есть множество разных персонажей, с которыми я мог столкнуться, и мне нужно предпринять разные действия, основанные на том, с каким персонажем я сталкиваюсь (а не только с X и Y). Есть ли другой способ, который вы могли бы предложить сделать? Я старался сделать его максимально компактным и эффективным. – donfmorrison

+0

благодарит за информацию. используя эту информацию, я добавил свое решение ниже. – donfmorrison

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]; 

} 
Смежные вопросы