文档章节

IOS --NSScanner类的用法

求是科技
 求是科技
发布于 2015/02/26 14:42
字数 972
阅读 560
收藏 1
点赞 0
评论 0

      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;                  

}


© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 89
博文 453
码字总数 228281
作品 0
成都
后端工程师
iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song ⋅ 05/10 ⋅ 0

Dhar/YTTInjectedContentKit

YTTInjectedContentKit iOS壳版本场景下的批量修改类名、属性名、插入混淆代码、修改项目名称的shell脚本 具体的实现和使用方法请参考我的博客文章: iOS使用shell脚本注入混淆内容 iOS使用S...

Dhar ⋅ 05/04 ⋅ 0

Proxy-Go 全平台 SDK v4.9 来啦!

Proxy-Go 全平台 SDK是proxy使用gombile实现了一份go代码编译为android和ios平台下面可以直接调用的sdk类库, 另外还为linux和windows提供sdk支持,基于这些类库,APP开发者可以轻松的开发出各...

狂奔的蜗牛. ⋅ 06/12 ⋅ 0

Proxy-Go 全平台 SDK 迎来 v4.8 更新!

Proxy-Go 全平台 SDK是proxy使用gombile实现了一份go代码编译为android和ios平台下面可以直接调用的sdk类库, 另外还为linux和windows提供sdk支持,基于这些类库,APP开发者可以轻松的开发出各...

狂奔的蜗牛. ⋅ 05/04 ⋅ 2

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

iOS精选源码 一款优秀的 聆听夜空FM 源码(http://www.code4app.com/thread-14546-1-1.html) zhPopupController 简单快捷弹出自定义视图(http://www.code4app.com/thread-14861-1-1.html) WHS......

sunnyaigd ⋅ 06/04 ⋅ 0

Macaca App inspector

为方便更多用户查找界面元素,提供了同时支持 Android 和 iOS 平台的 Inspector 工具,此功能也是 Macaca 录制器的重要部分。另外,Web 元素查找请直接只用 。 Android iOS 安装 用法 更多用...

awesome@qa ⋅ 05/16 ⋅ 0

Appuploader的安装介绍

注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需安装,Windows 64位系统点击appuploader.exe启动;如果是Linux/Windows 32位系统或Mac系统双击appuplo...

webmirror ⋅ 05/11 ⋅ 0

iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊 ⋅ 05/11 ⋅ 0

iOS Animation创建及使用

iOS 实现的基本动画 头尾式动画 2.block动画的方法 iOS显示关键帧动画 关键帧动画 动画的创建和使用 第一种:UIView 代码块调用 第二种:UIView [begin commit]模式 第三种:使用Core Animat...

奋拓达 ⋅ 05/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部