Как использовать NSScanner? - PullRequest
       23

Как использовать NSScanner?

16 голосов
/ 27 февраля 2009

Я только что прочитал документ Apple от NSScanner. Я пытаюсь получить целое число этой строки: @ "пользователь вошел в систему (3 попытки)".

Я не могу найти ни одного примера, как сканировать в скобках. Есть идеи?

Вот код:

NSString *logString = @"user logged (3 attempts)";
NSScanner *aScanner = [NSScanner scannerWithString:logString];

[aScanner scanInteger:anInteger];

NSLog(@"Attempts: %i", anInteger);

Ответы [ 5 ]

50 голосов
/ 20 августа 2009

Решение Ziltoid работает, но это больше кода, чем вам нужно.

Я бы не стал создавать экземпляр NSScanner для данной ситуации. NSCharacterSet и NSString предоставят вам все, что вам нужно:

    NSString *logString = @"user logged (3 attempts)";
    NSString *digits = [logString stringByTrimmingCharactersInSet:
         [[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
    NSLog(@"Attempts: %i", [digits intValue]);

или в Swift:

    let logString = "user logged (3 attempts)"
    let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet
    let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits)
    NSLog("Attempts: %i", digits.intValue)
17 голосов
/ 27 февраля 2009

`Вот что я делаю, чтобы получить определенные значения из строки

Сначала я определил этот метод

- (NSString *)getDataBetweenFromString:(NSString *)data leftString:(NSString *)leftData rightString:(NSString *)rightData leftOffset:(NSInteger)leftPos; 
{         
    NSInteger left, right;         
    NSString *foundData;
    NSScanner *scanner=[NSScanner scannerWithString:data];                  
    [scanner scanUpToString:leftData intoString: nil];         
    left = [scanner scanLocation];         
    [scanner setScanLocation:left + leftPos];         
    [scanner scanUpToString:rightData intoString: nil];         
    right = [scanner scanLocation] + 1;         
    left += leftPos;         
    foundData = [data substringWithRange: NSMakeRange(left, (right - left) - 1)];         return foundData; 
}

Тогда позвони.

foundData = [self getDataBetweenFromString:data leftString:@"user logged (" rightString:@"attempts)" leftOffset:13];

leftOffset - количество символов для левой строки

Может быть проще, но это было мое решение.

5 голосов
/ 03 декабря 2011

Вот простое решение с использованием NSScanner (да, у @NSResponder есть действительно аккуратное решение!):

NSString *logString = @"user logged (3 attempts)";
NSString *numberString;
NSScanner *scanner = [NSScanner scannerWithString:logString];
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
[scanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&numberString];
NSLog(@"Attempts: %i", [numberString intValue]);

Вывод NSLog:

Attempts: 3
5 голосов
/ 13 августа 2009

NSScanner - линейный сканер. Вы должны отсканировать то, что вы не хотите, чтобы получить то, что вы хотите.

Вы можете сделать [aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL], чтобы перепрыгнуть через все до числового символа. Затем вы делаете [aScanner scanInteger:&anInteger] для сканирования символа в целое число.

1 голос
/ 02 марта 2016

вот обычное использование

NSString *logString = @"user logged (3 attempts)";
NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];
...