используйте NSScanner для разбора строки - PullRequest
1 голос
/ 27 июля 2011

Строка для анализа, состоящая из двух строк:

00:02.0 VGA compatible controller [0300]: Intel Corporation 82945G/GZ Integrated Graphics Controller [8086:2772] (rev 02)
00:02.1 Display controller [0380]: Intel Corporation 82945G/GZ Integrated Graphics Controller [8086:2776] (rev 02)

чтобы получить эти строки:

(из 1-й строки)

  • VGA-совместимый контроллер
  • Intel Corporation 82945G / GZ Встроенный графический контроллер
  • [8086: 2772]

(из 2-й строки)

  • Дисплей контроллера
  • Intel Corporation 82945G / GZ Встроенный графический контроллер
  • [8086: 2776]

Теперь мой стартовый код:

NSScanner *scn = [NSScanner scannerWithString:strtoparse];
NSString *devtype;      
while ([scn isAtEnd] == NO)
    {
       if( [scn scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL] &&
        [scn scanUpToString:@"[" intoString:&devtype]);
    }

и это не работает. Я даже не могу понять сканер из документов. Так может кто-нибудь опубликовать рабочий код?

1 Ответ

3 голосов
/ 29 июля 2011

Быстрый фрагмент:

NSString *theString = @"00:02.0 VGA compatible controller [0300]: Intel Corporation 82945G/GZ Integrated Graphics Controller [8086:2772] (rev 02)\n00:02.1 Display controller [0380]: Intel Corporation 82945G/GZ Integrated Graphics Controller [8086:2776] (rev 02)";

NSScanner *theScanner = [NSScanner scannerWithString:theString];

NSCharacterSet *space = [NSCharacterSet characterSetWithCharactersInString:@" "];
NSCharacterSet *bracket = [NSCharacterSet characterSetWithCharactersInString:@"["];
NSCharacterSet *linebreak = [NSCharacterSet newlineCharacterSet];

NSString *type;
NSString *name;
NSString *number;

while (![theScanner isAtEnd]) 
{
    [theScanner scanUpToCharactersFromSet:space intoString:nil] ;
    [theScanner scanUpToCharactersFromSet:bracket intoString:&type]; 
    [theScanner scanUpToCharactersFromSet:space intoString:nil] ;
    [theScanner scanUpToCharactersFromSet:bracket intoString:&name]; 
    [theScanner scanUpToCharactersFromSet:space intoString:&number]; 
    [theScanner scanUpToCharactersFromSet:linebreak intoString:nil] ;

    NSLog(type);
    NSLog(name);
    NSLog(number);
}

Выход:

VGA compatible controller 
Intel Corporation 82945G/GZ Integrated Graphics Controller 
[8086:2772]
Display controller 
Intel Corporation 82945G/GZ Integrated Graphics Controller 
[8086:2776]
...