NSScanner-备
注意:在扫描的时候,如果 空格是不需要扫描的,那么将会忽略空格。
如下代码:
1 NSString *string = @"my age is d 23 34.0";
2 int i;
3 float f;
4 NSString *theString = @"my age is";
5 NSString *resultString;
6 NSString *dString;
7
8 //扫描字符串
9 NSScanner *theScanner = [NSScanner scannerWithString:string ];
10 [theScanner scanString:theString intoString:&resultString];
11 NSLog(@"resultString is %@",resultString);
12
13 //扫描字符串中的d字符
14 [theScanner scanString:@"d" intoString:&dString];
15 NSLog(@"d string is %@",dString);
16
17
18 //扫描字符串中的整型数据
19 [theScanner scanInteger:&i];
20 NSLog(@"intergent is %d",i);
21 //扫描字符串中的浮点型数据
22 [theScanner scanFloat:&f];
23 NSLog(@"float is %f",f);
输出的结果为:
2012-08-18 16:01:26.419 ScannerDemo[1225:f803] resultString is my age is
2012-08-18 16:01:29.360 ScannerDemo[1225:f803] d string is d
2012-08-18 16:01:33.735 ScannerDemo[1225:f803] intergent is 23
2012-08-18 16:01:35.359 ScannerDemo[1225:f803] float is 34.000000
解析:在字符串
string 中,“is”和“d”之间的空格不需要扫描的,然后我定义了一个
theString 字符串,该字符串之后没有空格,然后扫描 theString d,此时空格没有计入扫描的范围内,所以扫描会忽略空格。
一、将十六进制转化为十进制。如下:
unsigned int r;
NSString *rString = @"EF";
其中:rString表示十六进制的字符。r表示十六进制对应的十进制。
-
NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。
创建一个Scanner
NSScanner是一个类族, NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向字符串的开头。scanner方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要使用while循环,
例如如下代码所示:
- float aFloat;
- NSScanner *theScanner = [NSScanner scannerWithString:aString];
- while ([theScanner isAtEnd] == NO) {
- [theScanner scanFloat:&aFloat];
- // implementation continues...
- }
以上例子会循环的搜索字符串中的浮点值,并赋值给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)。
- NSString *bananas = @"137 small cases of bananas";
- NSString *separatorString = @" of";
- NSScanner *aScanner = [NSScanner scannerWithString:bananas];
- NSInteger anInteger;
- [aScanner scanInteger:&anInteger];
- NSString *container;
- [aScanner scanUpToString:separatorString intoString:&container];
查找字符串separatorString为“ of”关系重大。默认scanner会忽略空白字符,因此在数字137后面的空格被忽略。但是当scanner从空格后面的字符开始时,所有的字符都被加到了输出字符串中,一直到遇到搜索字符串(“of”)。
如果搜索字符串是“of”(前面没空格),container的第一个值应该是“smallcases ”(后面有个空格);如果搜索字符串是“ of”(前面有空格),则container的第1个值是“small cases”(后面无空格)。
在扫描到指定字符串(搜索字符串)之后,scanner的位置指向了该字符串开始处。如果你想继续扫描该字符串之后的字符,必须先扫描指定字符串(搜索字符串)。下列代码演示了如何跳过搜索字串并取得产品类型。注意我们使用了substringFromIndex:,等同于继续扫描直到整个字符串的末尾。
- [aScanner scanString:separatorString intoString:NULL];
- NSString *product;
- product = [[aScanner string] substringFromIndex:[aScanner scanLocation]];
- // could also use:
- // 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默认忽略空白字符和换行符,循环中没有指定对它们的处理(尤其对于读取末尾的整数而言,并不需要处理额外的空白字符)。
- NSString *string = @"Product: Acme Potato Peeler; Cost: 0.98 73\n\
- Product: Chef Pierre Pasta Fork; Cost: 0.75 19\n\
- Product: Chef Pierre Colander; Cost: 1.27 2\n";
- NSCharacterSet *semicolonSet;
- NSScanner *theScanner;
- NSString *PRODUCT = @"Product:";
- NSString *COST = @"Cost:";
- NSString *productName;
- float productCost;
- NSInteger productSold;
- semicolonSet = [NSCharacterSet characterSetWithCharactersInString:@";"];
- theScanner = [NSScanner scannerWithString:string];
- while ([theScanner isAtEnd] == NO)
- {
- if ([theScanner scanString:PRODUCT intoString:NULL] &&
- [theScanner scanUpToCharactersFromSet:semicolonSet
- intoString:&productName] &&
- [theScanner scanString:@";" intoString:NULL] &&
- [theScanner scanString:COST intoString:NULL] &&
- [theScanner scanFloat:&productCost] &&
- [theScanner scanInteger:&productSold])
- {
- NSLog(@"Sales of %@: $%1.2f", productName, productCost * productSold);
- }
- }
本地化
Scanner支持本地化的扫描,可以指定语言和方言。NSScanner只在小数点分隔符上使用locale属性(以NSDecimalSeparator为key)。你可以用lcoalizedScannerWithString:创建指定locale的scanner,或者用setLocale:方法显示地指定scanner的locale属性。如果你不指定locale,scanner假定使用默认的locale。
NSScanner-备的更多相关文章
- Oracle冷备迁移脚本(文件系统)
Oracle冷备迁移脚本(文件系统) 两个脚本: 配置文件生成脚本dbinfo.sh 网络拷贝到目标服务器的脚本cpdb16.sh 1. 配置文件生成脚本 #!/bin/bash #Usage: cr ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...
- CentOS系统MySQL双机热备配置
1 概述 在集成项目中需要应对不同环境下的安装配置,主流操作系统大致可以分为三种:Linux.Windows以及UNIX.其中Linux备受青睐的主要原因有两个: 首先,Linux作为自由软件有两个 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- 一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)
单机部署(stand-alone):只有一个饮水机提供服务,服务只部署一份 集群部署(cluster):有多个饮水机同时提供服务,服务冗余部署,每个冗余的服务都对外提供服务,一个服务挂掉时依然可用 热 ...
- mysql主备(centos6.4)
服务器基本环境: 两台centos6.4.iptables diabled .selinux disabled 两台的hosts解析 #yum install mysql -y //这个一定要装 ...
- Keepalived+LVS+nginx双机热备
Keepalived简介 什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了, 也就是所谓的高可用或热备,用来防止单点故障的发生. Keepalived采 ...
- Oracle备库TNS连接失败的分析
今天在测试12c的temp_undo的时候,准备在备库上测试一下,突然发现备库使用TNS连接竟然失败. 抛出的错误如下: $ sqlplus sys/oracle@testdb as sysdba S ...
随机推荐
- GCD使用经验与技巧浅谈--备
GCD(Grand Central Dispatch)可以说是Mac.iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧. dispatch_once_t必须是全局或static变量 ...
- 搭建rac对单实例的MAA
一:实验环境 系统:redhat 4 三台计算机rac1,rac2,dg. --其中rac为主库,单实例为备库 已在虚拟机里搭建好集群环境(rac1,rac2); dg计算机里还没有建任何数据库(只安 ...
- DDUI For Delphi Seattle Directui界面组件
http://www.delphigear.cn/0/11258/go.aspx http://bbs.csdn.net/topics/390285613
- Google GFS文件系统深入分析
Google GFS文件系统深入分析 现在云计算渐成潮流,对大规模数据应用.可伸缩.高容错的分布式文件系统的需求日渐增长.Google根据自身的经验打造的这套针对大量廉价客户机的Google GFS文 ...
- Entify Framewrok - Join的使用方法
问题:有2个表,使用id相连,如何用Join语法将其连接起来? 如下代码 List<tblAssociation> assoList = dataContext.tblAssociatio ...
- ubuntu14.04折腾迅雷xware
迅雷一直没有出linux版,wine不想去弄.linux下虽然也有各种bt软件,无奈我试用后却发现速度远比不上迅雷,甚至有些资源根本找不到.而有些迅雷的专用链接,更是没法下(原谅我2M的小水管,却喜欢 ...
- (转)iOS7人机界面设计规范 - 目录
英文原文出自苹果官方的iOS7设计资源-iOS人机界面设计规范(预发布版本),由C7210自发翻译,并首发于Beforweb.com.如需转载,请注明译者及出处信息. UI设计基础 为iOS7而设计 ...
- (转)iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第四章译文精选,其余章节将陆续放出.上一篇:Wow ...
- Performance Tuning guide 翻译 || 前言
CSDN 对格式支持比較弱,能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. 前言Preface 包含例如以下几个小节 l Au ...
- Mongo服务器集群配置【转】
http://www.cnblogs.com/wly923/tag/MongoDB/ 当前标签: MongoDB Mongo服务器集群配置学习三——分片 风行影者 2013-04-14 22:35 ...