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];