如何使用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];