如何使用NSScanner?

我刚刚读过苹果的NSScanner 文件 。 我试图得到该string的整数:@“user logged(3 attempts)”。

我找不到任何例子,如何在圆括号内扫描。 有任何想法吗?

代码如下:

NSString *logString = @"user logged (3 attempts)"; NSScanner *aScanner = [NSScanner scannerWithString:logString]; [aScanner scanInteger:anInteger]; NSLog(@"Attempts: %i", anInteger); 

“这是我从string中获得某些值的方法

首先我定义了这个方法

 - (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是左侧string的字符数

可能是一个更简单的方法,但这是我的解决scheme。

Ziltoid的解决scheme是有效的,但是它比你需要的代码更多。

我不打扰实例化一个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) 

这是一个简单的解决scheme使用NSScanner(是的,@NSResponder有一个非常简洁的解决scheme!):

 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 

NSScanner是一个线性扫描器。 你必须扫描你不想得到你想要的东西。

你可以做[aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL]跳过一切,直到数字字符。 然后你[aScanner scanInteger:&anInteger]扫描字符到一个整数。

这里是reg-ex的用法

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