iOS NSScanner的学习使用

NSScanner继承自NSObject,遵守NSCopying协议。是一个用于扫描字符串的抽象类。学会使用这个类,在做对字符串的处理时还是很有帮助的。尤其是在做一些比如将字符串中的某几个关键字变色等。不过这不是本节的关键,因此不做展开。这个类的作用还是要多靠观察和实践,文中有不对的地方多多包涵。


@property (readonly,copy) NSString *string;

// 返回当前被扫描的字符串

@property NSUInteger scanLocation;

// 当前扫描的位置,默认是从0开始的。通过设置这个属性值,可以自定义扫描的位置

@property (nullable,copy) NSCharacterSet *charactersToBeSkipped;

// 这个集合是用来设置我们需要跳过扫描的一个字符集合

@property BOOL caseSensitive;

// 是否大小写敏感

@property (nullable,retain) id locale;

// 具体用法不知

给出文档的解释

A scanner’s locale affects the way it interprets numeric values from the string. In particular, a scanner uses the locale’s decimal separator to distinguish the integer and fractional parts of floating-point representations. A scanner with no locale set uses non-localized values. New scanners have no locale by default.

- (instancetype)initWithString:(NSString *)string;

// 指定的扫描器初始化方法,用给定扫描字符串初始化

- (BOOL)scanInt:(nullableint *)result;

// 判断给定扫描的字符串的int值是不是整型


NSString *scanString = @"123";

int i;

[scanner scanInt:&i]; // 返回YES


- (BOOL)scanInteger:(nullableNSInteger *)result;

// 与上面的方法相同,就是输入的参数类型不同

- (BOOL)scanLongLong:(nullablelong long *)result;

// 扫描长长整型

- (BOOL)scanUnsignedLongLong:(nullableunsigned longlong *)result;

// 扫描无符号的长长整型

- (BOOL)scanFloat:(nullablefloat *)result;

// 扫描float型的数据


NSString *scanString = @"123";

float f;

[scanner scanFloat:&f]; // 返回NO


- (BOOL)scanDouble:(nullabledouble *)result;

// 扫描double类型的数据

- (BOOL)scanHexInt:(nullableunsigned *)result;                                        // Optionally prefixed with "0x" or "0X"

- (BOOL)scanHexLongLong:(nullableunsigned longlong *)result;  // Optionally prefixed with "0x" or "0X"

- (BOOL)scanHexFloat:(nullablefloat *)result;                  // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.

- (BOOL)scanHexDouble:(nullabledouble *)result;                // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.

// 扫描前缀是否带有0x或者0X



NSString *scanString = @"0x1";

NSScanner *scanner = [NSScanner scannerWithString:scanString];

unsigned r;

[scanner scanHexInt:&r]; // 返回YES


- (BOOL)scanString:(NSString *)string intoString:(NSString *__nullable * __nullable)result;

// 给定一个字符串,从扫描的字符串中找出相同的



NSString *scanString = @"897岁k";

NSScanner *scanner = [NSScanner scannerWithString:scanString];

NSString *availdStr;

while (!scanner.isAtEnd) {

  scanner.scanLocation++;

NSLog(@"%ld",scanner.scanLocation);

[scanner scanString:@"k"intoString:&availdStr];

if (availdStr) {

  NSLog(@"%@",availdStr);

}

}

输出:

2016-05-24 20:15:42.571 NSScanner[5391:383531] 1

2016-05-24 20:15:42.572 NSScanner[5391:383531] 2

2016-05-24 20:15:42.572 NSScanner[5391:383531] 3

2016-05-24 20:15:42.572 NSScanner[5391:383531] 4

2016-05-24 20:15:42.572 NSScanner[5391:383531] k



- (BOOL)scanCharactersFromSet:(NSCharacterSet *)set intoString:(NSString *__nullable * __nullable)result;

// 扫描出给定字符集合中的字符放入到value中,只要是set集合中有的字符或字符串都会被扫描出来,直到下一个扫描空缺。



NSString *scanString = @"897岁kGs5a--@家 1k12&&*)  l12";

NSScanner *scanner = [NSScanner scannerWithString:scanString];

NSString *availdStr;

while (!scanner.isAtEnd) {

  scanner.scanLocation++;

[scanner scanCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"kG125"]intoString:&availdStr];

if (availdStr) {

  NSLog(@"%@",availdStr);

}

}

输出:

2016-05-24 20:20:33.180 NSScanner[5435:388398] kG

2016-05-24 20:20:33.181 NSScanner[5435:388398] 5

2016-05-24 20:20:33.181 NSScanner[5435:388398] 5

2016-05-24 20:20:33.181 NSScanner[5435:388398] 5

2016-05-24 20:20:33.181 NSScanner[5435:388398] 5

2016-05-24 20:20:33.182 NSScanner[5435:388398] 5

2016-05-24 20:20:33.182 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.182 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.182 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.182 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.182 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.183 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.183 NSScanner[5435:388398] 1k12

2016-05-24 20:20:33.183 NSScanner[5435:388398] 12



- (BOOL)scanUpToString:(NSString *)string intoString:(NSString *__nullable * __nullable)result;

// 扫描到给定的字符串后,将从一开始扫描位开始的地方开始截取,并且去掉指定的string(第一个参数);或者是到扫描结束,将字符串末尾往前直到碰到--为止的字符串截取下来。


NSString *scanString = @"897岁kGs5a--@家--1k12&&*)  l12";

NSScanner *scanner = [NSScanner scannerWithString:scanString];

scanner.scanLocation = 3;

NSString *availdStr;

while (!scanner.isAtEnd) {

    scanner.scanLocation++;

[scanner scanUpToString:@"-"intoString:&availdStr];

if (availdStr) {

  NSLog(@"%@",availdStr);

}

}

输出:

2016-05-24 20:33:04.318 NSScanner[5600:402085] kGs5a

2016-05-24 20:33:04.319 NSScanner[5600:402085] kGs5a

2016-05-24 20:33:04.320 NSScanner[5600:402085] @家

2016-05-24 20:33:04.320 NSScanner[5600:402085] @家

2016-05-24 20:33:04.321 NSScanner[5600:402085] 1k12&&*)  l12


- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)set intoString:(NSString *__nullable * __nullable)result;

// 扫到给定集合,原理与上一条相同

+ (instancetype)scannerWithString:(NSString *)string;

// 类方法创建

+ (id)localizedScannerWithString:(NSString *)string;

// 不是很明白

给出文档的解释

Returns an NSScanner object that scans a given string according to the user’s default locale.
An NSScanner object that scans aString according to the user’s default locale.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容