Как использовать NSScanner?
Я только что прочитал Apple docu NSScanner.
Я пытаюсь получить целое число этой строки: @ "пользователь зарегистрировался (3 попытки)".
Я не могу найти какой-либо пример, как сканировать в круглых скобках. Любые идеи?
Здесь код:
NSString *logString = @"user logged (3 attempts)";
NSScanner *aScanner = [NSScanner scannerWithString:logString];
[aScanner scanInteger:anInteger];
NSLog(@"Attempts: %i", anInteger);
Ответы
Ответ 1
`Вот что я делаю, чтобы получить определенные значения из строки
Сначала я определил этот метод
- (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 - количество символов для левой строки
Может быть проще, но это было мое решение.
Ответ 2
Решение 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)
Ответ 3
NSScanner
- линейный сканер. Вам нужно просканировать материал, который вы не хотите, чтобы получить то, что вы действительно хотите.
Вы можете сделать [aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL]
, чтобы перепрыгнуть все до символа числа. Затем вы выполняете [aScanner scanInteger:&anInteger]
для сканирования символа в целое число.
Ответ 4
Вот простое решение с использованием 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
здесь используется reg-ex
NSString *logString = @"user logged (3 attempts)";
NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];