文档章节

IOS --NSScanner类的用法

求是科技
 求是科技
发布于 2015/02/26 14:42
字数 972
阅读 598
收藏 1

      NSScanner是一个类,用于在字符串中扫描指定的字符,通常是将他们转换成数字和别的字符串。我们可以在创建NSScanner时指定它的string属性,然后scanner会按照我们的要求从头到尾扫描这个字符串的每个字符。

      创建一个NSScanner

      NSScanner是一个类族,通常我们可以使用scannerWithString或locallzedScannerWithString方法初始化一个scanner。这两个方法都返回一个scanner对象,并用我们传递的字符串参数初始化其string属性。刚创建的scanner对象指向字符串的开头。scanner方法开始扫描,比如有:scanInt、scanDouble、scanString:intoString。示例代码如下:

int val;
NSScanner *theScanner = [NSScanner scannerWithString:aString]; 
while([theScanner isAtEnd] == NO)
{
   [theScanner scanInt:&val];
}

以上例子会循环搜索字符串中的整型值,并赋值给val参数。isAtEnd方法会紧接上一次搜索到的字符位置继续搜索,看是否存在下一个整型值,直到扫描结束。扫描的核心是字符位置的移动,位置在不停的扫描中移动,直至扫描结束。

      Scanner的使用

      以字符串“132 panda lxl of apple”为例,在扫描完一个整数之后,scanner的位置将变成3,也即是数字后面的空格处。scanner在任何操作时会跳过空白字符之后才开始,当它找到一个可以扫描的字符时,它会用全部字符去和指定内容匹配,scanner默认情况下会忽略空白字符和换行符。

举个实际例子:132 fushi pingguo of apple

下面的代码可以找出苹果的数量(132)和名称(fushi)。

NSString *apple = @"132 fushi pingguo of apple";
NSString *separateString = @" of";//注意of前面有一个空格
NSScanner *aScanner = [NSScanner scannerWithString:apple];
NSInteger anInteger;
[aScanner scanInteger:&anInteger];//得到数量132
NSString *name;
[aScanner scanUpToString:separateString intoString:&name];//得到名称fushi pingguo

查找字符串separateString为"of"很重要,scanner默认会忽略空白字符,因此数字132后面的空格会被忽略。但是当scanner从空格后面的字符开始扫描时,所有的字符都会被加载到输出字符串中,一直到遇到搜索字符串"of"。

注意:如果搜索字符串是“of”,(前面没空格),name的值应该是"fushipingguo "(最后面有个空格);如果搜索字符串是" of",(前面有空格),则name的值为"fushi pingguo"(最后面无空格)。在扫描到指定字符串(搜索字符串)后,scanner的位置指向了该字符串的开始处。此时,如果我们想继续扫描该字符串之后的字符,则同上面一样,必须先扫描指定字符串(搜索字符串)。下面的代码演示了如何跳过搜索字符串并取得产品类型,代码如下:

[aScanner scanString:separateString intoString:NULL];
NSString *product;
product = [[aScanner string] substringFromIndex:[aScanner scanlocation]];

实例:

假设我们有如下字符串:

Product:Lxl Panda Peter;Cost:0.23 87

Product:Xiong Mao Bet;Cost:0.38 76

Product:San Di Sex;Cost:1.29 3

以下代码演示了读取产品名称和价格(float类型)的操作,跳过"Product:"和"Cost:"字串以及";"号。

NSString *Sumstring = @"Product:Lxl Panda Peter;Cost:0.23 87\n\
Product:Xiong Mao Bet;Cost:0.38 76\n\
Product:San Di Sex;Cost:1.29 3\n";
NSCharacterSet *semicolonSet;
NSScanner *theScanner;
NSString *PRODUCT =@"Product:";
NSString *COST = @"Cost:";
NSString *productNmae;
float productCost;
NSInteger productSold;
semicolonset = [NSCharacterSet charactSetWithCharactersInString:@";"];
theScanner = [NSScanner scannerWithString:Sumstring];
while([theScanner isAtEnd] == NO)
{
    if([theScanner scanString:PRODUCT intoString:NULL] &&
       [theScanner scanUpToCharactersFrom:semicolonSet intoString:&productNmae]&&
       [theScanner scanString:@";" intoString:NULL]&&
       [theScanner scanString:COST intoString:NULL]&&
       [theScanner scanFloat:&productCost]&&
       [theScanner scanInteger:&productSold])
    {
         NSLog(@"Sales of %@:$%1.2f",productNmae,productCost*productSold);
    }
}

实例结束

实例二

从字符串中提取数字

-(void)findNumFromStr

{

    NSString *originalString = @"a1b2c3d4e5f6g7h8i9j0";

    NSMutableString *numberString = [[NSMutableString alloc] init];

    NSString *tempStr;

    NSScanner *scanner = [NSString scannerWithString:originalString];

    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

    while(![scanner isAtEnd])

    {

         [scanner scanUpToCharactersFromSet:numbers intoString:NULL];

         [scanner scanCharactersFromSet:numbers intoString:&tempStr];

         [numberString appendString:tempStr];

         tempStr = @"";

    }  

    int number = [numberString integerValue];

    return number;                  

}


© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 90
博文 438
码字总数 225859
作品 0
成都
后端工程师
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0
C++文件读写详解(ofstream,ifstream,fstream)

在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view pl...

涩女郎
2015/08/19
0
0
react native 集成人脸识别 --ios

上一篇介绍了 android 端的集成 这篇介绍下ios的集成. 整体思路和android类似:ios原生这边集成sdk后,写个ios和RN的交互类,暴露给RN ,RN再调用 跳转人脸识别页。成功,或失败 内部sdk中有...

JsLin_
07/24
0
0
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/01
0
0
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql 联结,级联查询总结区分

其实我对 数据库的级联或者联结查询一直都是会用,项目能查询出来自己想要的结果即可。 毕竟SQL使用复杂的查询毕竟比较少,而且不难使用。 至于区分他们,我还真的有点模糊。 在看 《SQL必知...

之渊
14分钟前
0
0
区块链入门教程分享区块链POW证明代码实现demo

兄弟连区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主...

兄弟连区块链入门教程
21分钟前
0
0
laravel删除图片

/** * 删除信用卡 * @param Request $request * @return array|\Illuminate\Http\JsonResponse * @throws \App\Exceptions\CustomException */public function modifyCreditCard......

vio小黑
24分钟前
0
0
Mybatis TypeParameterResolver

TypeParameterResolver这是个工具类,提供了一系类静态方法来解析指定类中字段,方法返回值或作者方法参数类型。

xjk123
27分钟前
0
0
mybatis mapper里面>= ,<=转义

>= 对应 >= > 对应 > <= 对应 <= < 对应 <

yan_liu
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部