NSScanner 字符串扫描机
NSScanner : NSObject
扫描机基本配置
// 初始化
NSScanner *scanner = [NSScanner scannerWithString:@"abc DEF 123 啊啊啊 0x22"];
// 字符
NSString *scannerString = scanner.string;
// 开始位置
scanner.scanLocation = 2;
// 过滤字符
scanner.charactersToBeSkipped = [NSCharacterSet lowercaseLetterCharacterSet];
// 不忽略大小写,默认是 NO,忽略大小写的
scanner.caseSensitive = YES;
// 本地化
scanner.locale = [[NSLocale alloc] initWithLocaleIdentifier: NSCalendarIdentifierGregorian];
注意过滤字符,与大小写的配置,会影响下面的扫描
拓展 NSExtendedScanner
- 完整扫描
NSScanner *scanner = [NSScanner scannerWithString:@"123"];
int a;
// 对扫描机需要扫描的字符,进行完整扫描识别,如果该字符串是 int,res 为 YES,a 的值有效,反之亦然;
BOOL res = [scanner scanInt:&a];
类似的扫描 double、hex 略
- 部分扫描
// 扫描 指定字符串是前缀
NSString *c;
BOOL res1 = [scanner scanString:@" DEF" intoString:&c];
// 扫描 直到 指定字符集
NSString *d;
BOOL res2 = [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&d];
字符串与字符集,各举了一个例子
- 属性 isAtEnd
NSScanner *scanner = [NSScanner scannerWithString:@"abc DEF 123 啊啊啊 0x22"];
while (NO == [scanner isAtEnd]) {
int resInt;
BOOL res = [scanner scanInt:&resInt];
NSLog(@"%zi", resInt);
}
例子会导致无限循环,因为扫描机无法扫描到结尾,因为扫描指定的字符不是数字,在扫描 a,的时候就结束了
拓展 NSDecimalNumberScanning
与 扫描 int 哪些类似
NSScanner *scanner = [NSScanner scannerWithString:@"123.456"];
NSDecimal decimal;
BOOL res = [scanner scanDecimal:&decimal];
NSDecimalNumber *decimalNum = [NSDecimalNumber decimalNumberWithDecimal:decimal];