http://blog.csdn.net/likendsl/article/details/7974761

NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。

创建一个Scanner

NSScanner是一个类族, NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向字符串的开头。scanner方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要使用while循环,

例如如下代码所示:

  1. float aFloat;
  2. NSScanner *theScanner = [NSScanner scannerWithString:aString];
  3. while ([theScanner isAtEnd] == NO) {
  4. [theScanner scanFloat:&aFloat];
  5. // implementation continues...
  6. }

以上例子会循环的搜索字符串中的浮点值,并赋值给aFloat参数。这个时候isAtEnd便会紧接上一次搜索到的字符位置继续搜索看是否存在下一个浮点值,直至扫描结束。扫描动作的核心就是位置的变动。位置不停地在扫描中移动,直至结束扫描。

另外,还可以通过setCaseSensitive:方法设置是否忽略大小写,默认是忽略。

Scanner的使用

扫描操作从上次扫描的位置开始,并且继续往后扫描直到指定的内容出现为止(如果有的话)。

以字符串“137 small cases of bananas”为例,在扫描完一个整数之后,scanner的位置将变为3,也即数字后面的空格处。通常,你会继续扫描并跳过你不关心的字符。那么你可以用setScanLocation:方法跳过某几个字符(也可以用这个方法在发生某些错误后,重新开始扫描字符串的某部分)。如果你想跳过某种特殊的字符集中的字符时,可以使用setCharactersToBeSkipped:方法。scanner在任何扫描操作时会跳过空白字符之后才开始。但是当它找到一个可以扫描的字符时,它会用全部字符去和指定内容匹配。scanner默认情况下会忽略空白字符和换行符。注意,对于忽略字符,总是大小写敏感的。例如要忽略所有原音字母,你必须使用“AEIOUaeiou”,而不能仅仅是“AEIOU”或“aeiou”。

如果你想获取当前位置的某个字符串的内容,可以使用scanUpToString:intoString:方法(如果你不想保留这些字符,可以传递一个NULL给第2个参数)。

例如,以下列字符串为例:

137 small cases of bananas

下面的代码,可以从字符串中找出包装规格(small cases)和包装数量(137)。

  1. NSString *bananas = @"137 small cases of bananas";
  2. NSString *separatorString = @" of";
  3. NSScanner *aScanner = [NSScanner scannerWithString:bananas];
  4. NSInteger anInteger;
  5. [aScanner scanInteger:&anInteger];
  6. NSString *container;
  7. [aScanner scanUpToString:separatorString intoString:&container];

查找字符串separatorString为“ of”关系重大。默认scanner会忽略空白字符,因此在数字137后面的空格被忽略。但是当scanner从空格后面的字符开始时,所有的字符都被加到了输出字符串中,一直到遇到搜索字符串(“of”)。

如果搜索字符串是“of”(前面没空格),container的第一个值应该是“smallcases ”(后面有个空格);如果搜索字符串是“ of”(前面有空格),则container的第1个值是“small cases”(后面无空格)。

在扫描到指定字符串(搜索字符串)之后,scanner的位置指向了该字符串开始处。如果你想继续扫描该字符串之后的字符,必须先扫描指定字符串(搜索字符串)。下列代码演示了如何跳过搜索字串并取得产品类型。注意我们使用了substringFromIndex:,等同于继续扫描直到整个字符串的末尾。

  1. [aScanner scanString:separatorString intoString:NULL];
  2. NSString *product;
  3. product = [[aScanner string] substringFromIndex:[aScanner scanLocation]];
  4. // could also use:
  5. // product = [bananas substringFromIndex:[aScanner scanLocation]];

示例:

假设你有如下字符串:

Product: Acme Potato Peeler; Cost: 0.98 73
Product: Chef Pierre Pasta Fork; Cost: 0.75 19
Product: Chef Pierre Colander; Cost: 1.27 2

以下代码演示了读取产品名称和价格的操作(价格简单地读作一个float),跳过“Product:”和“Cost:"子串,以及分号。注意,因为scanner默认忽略空白字符和换行符,循环中没有指定对它们的处理(尤其对于读取末尾的整数而言,并不需要处理额外的空白字符)。

  1. NSString *string = @"Product: Acme Potato Peeler; Cost: 0.98 73\n\
  2. Product: Chef Pierre Pasta Fork; Cost: 0.75 19\n\
  3. Product: Chef Pierre Colander; Cost: 1.27 2\n";
  4. NSCharacterSet *semicolonSet;
  5. NSScanner *theScanner;
  6. NSString *PRODUCT = @"Product:";
  7. NSString *COST = @"Cost:";
  8. NSString *productName;
  9. float productCost;
  10. NSInteger productSold;
  11. semicolonSet = [NSCharacterSet characterSetWithCharactersInString:@";"];
  12. theScanner = [NSScanner scannerWithString:string];
  13. while ([theScanner isAtEnd] == NO)
  14. {
  15. if ([theScanner scanString:PRODUCT intoString:NULL] &&
  16. [theScanner scanUpToCharactersFromSet:semicolonSet
  17. intoString:&productName] &&
  18. [theScanner scanString:@";" intoString:NULL] &&
  19. [theScanner scanString:COST intoString:NULL] &&
  20. [theScanner scanFloat:&productCost] &&
  21. [theScanner scanInteger:&productSold])
  22. {
  23. NSLog(@"Sales of %@: $%1.2f", productName, productCost * productSold);
  24. }
  25. }

本地化

Scanner支持本地化的扫描,可以指定语言和方言。NSScanner只在小数点分隔符上使用locale属性(以NSDecimalSeparator为key)。你可以用lcoalizedScannerWithString:创建指定locale的scanner,或者用setLocale:方法显示地指定scanner的locale属性。如果你不指定locale,scanner假定使用默认的locale。

NSScanner知悉 (转)的更多相关文章

  1. 使用NSScanner,将十六进制字符串转十进制

    例子:  NSString * numStr = [@"0x110" substringFromIndex:2]; unsigned long long result = 0; N ...

  2. iOS中NSScanner 的用法

    NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以创建NSScanner时制定他的String属性,然后scanner会按照你的要求从头到尾扫描这 ...

  3. NSScanner用法详解

    NSScanner类用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符 ...

  4. iOS中的字符串扫描类NSScanner

    新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...

  5. oc for in 的时候nsscanner: nil string argument

    今天偶然发现,oc for in 动态的给一数组加东西,然后嵌套for in 会报nsscanner: nil string argument. 换成for循环就好了,暂时还没找到原因

  6. 字符串处理(正则表达式、NSScanner扫描、CoreParse解析器)-备用

    搜索 在一个字符串中搜索子字符串 最灵活的方法 1 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptio ...

  7. NSScanner-备

    注意:在扫描的时候,如果 空格是不需要扫描的,那么将会忽略空格. 如下代码:  1  NSString *string = @"my age is d 23    34.0";   ...

  8. NSSCanner 提取 指定 字符串

    /** *  从msg中提取指定的内容 * *  @param msg 字符串集合 * *  @return 从msg中提取指定的内容 */ -(NSString*)extractBodyFromMe ...

  9. NSScanner扫描字符串中()的内容

    //本事例去除小括号及其内部的内容 + (NSString *)changeStringWithString:(NSString *)string {  NSScanner*scanner = [NS ...

随机推荐

  1. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  2. jQuery的13个优点

    1.轻量级 JQuery非常轻巧,采用Dean Edwards编写的Packer压缩后,大小不到30KB,如果使用Min版并且在服务器端启用Gzip压缩后,大小只有18KB. gzip: 每天一个li ...

  3. Extjs 3.4 同值合并

    摘自:http://www.cnblogs.com/kunpengit/archive/2012/11/13/2768239.html/** * grid gridPanel 需要合并的表格 * ro ...

  4. DB2 常用命令小结

    . 打开命令行窗口 #db2cmd . 打开控制中心 # db2cmd db2cc . 打开命令编辑器 db2cmd db2ce =====操作数据库命令===== . 启动数据库实例 #db2sta ...

  5. mysql 5.0.46安装配置

    http://os.chinaunix.net/a2008/0801/986/000000986346.shtml RPM包和源码包存放位置 /usr/local/src 源码包编译安装位置(pref ...

  6. eBox(stm32) 之中断结构

    eBox的中断结构参考了mbed,和我们平时所用的中断结构有些差异,不容易理解,最近仔细看了底层代码,终于搞清楚了,总结一下         一  首先要要搞清楚的几个概念:类的静态成员,实例成员   ...

  7. LAMP环境搭建

    安装前说明: 先安装gcc gcc-c++ make 等 可用yum install -y gcc gcc-c++ make 也可以使用rpm安装不过需要注意依赖 1.安装apache 下载链接:ht ...

  8. 用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)

    新版用友u8.70下载地址:http://ftp.shangyuchem.com/应用软件/用友ERP-U8管理软件(8.70版).rar 准备好安装环境,因为需要SQLSERVER和IIS支持,而个 ...

  9. css浮动与绝对定位小记

    浮动 float属性可以设置的值为none,left,right.对于设置了浮动的元素,会向其父元素的左侧或右侧紧靠,默认情况下,盒子的宽度不再伸展,而是根据盒子里面的内容来确定.浮动可以让一个元素移 ...

  10. Hiho 1232 北京网络赛 F Couple Trees

    给两颗标号从1...n的树,保证标号小的点一定在上面.每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离. 比赛的时候想用倍增LCA做,但写渣了....后来看到题解是主 ...