学习笔记:NSScanner类的使用

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

属性:

@property (readonly, copy) NSString *string; // 初始化时赋给NSScanner的字符串

@property NSUInteger scanLocation;  // NSScanner扫描的起始位置

@property (copy) NSCharacterSet *charactersToBeSkipped; //扫描的时候需要忽略的值

@property
BOOL caseSensitive; //是否区分大小写

@property (retain)
id locale; //大概意思是不同语言环境解释字符串的方式不一样

@property (getter=isAtEnd,
readonly) BOOL atEnd; // 是否扫描完了

方法:

// 以下三个方法均可以用来初始化一个NSScanner对象

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

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

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

// On overflow, the below methods will return success and clamp

// 用来查找NSScanner对象中的相应一般对象(int型,double型等等)

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

- (BOOL)scanInteger:(NSInteger *)result NS_AVAILABLE(10_5,
2_0);

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

- (BOOL)scanUnsignedLongLong:(unsigned
long long *)result NS_AVAILABLE(10_9,
7_0);

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

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

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

- (BOOL)scanHexLongLong:(unsigned
long long *)result NS_AVAILABLE(10_5,
2_0);   // Optionally prefixed with "0x" or "0X"

- (BOOL)scanHexFloat:(float *)result NS_AVAILABLE(10_5,
2_0);                  
// Corresponding to %a or %A formatting. Requires "0x" or"0X"

- (BOOL)scanHexDouble:(double *)result NS_AVAILABLE(10_5,
2_0);                
// Corresponding to %a or %A formatting. Requires "0x" or "0X"

// 用来查找NSScanner中的指定字符串的对象

- (BOOL)scanString:(NSString *)string intoString:(NSString **)result; //从scan中扫描出set中的数据放入value中

- (BOOL)scanCharactersFromSet:(NSCharacterSet *)set intoString:(NSString **)result; //从scan中扫描出set中的数据放入value中

- (BOOL)scanUpToString:(NSString *)string intoString:(NSString **)result; //从scan中扫描出set之外的数据放入value中

- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)set intoString:(NSString **)result; //从scan中扫描出set之外的数据放入value中

使用:

1.查找一个字符串中所有的int型

NSString *str =
@"23.42ksjfk5k35j3kjsdkjks53k5j3k";

NSScanner *scanner = [NSScanner
scannerWithString:str]; 
// 创建一个NSScanner的对象

int num =
0;

while (scanner.isAtEnd ==
NO) {

// 如果有找到匹配的int型,scanLocation会自动跳转到最后一个数字的后面,如果没有找到,则scanLocation不会变化,要手动跳转

if ([scanner
scanInt:&num]) { //
如果有找到int型的数字,将其赋值给num

NSLog(@"%i", num);

} else {
// 如果没有找到,将scanner的scanLocation++

scanner.scanLocation++;

}

}

2.在iOS中使用HTML格式的字符串,去掉所有<>中的内容

NSString *str =
@"我爱你<lalala>大发<大大发>《》<adsfad>asfd";

NSScanner *scanner = [NSScanner
scannerWithString:str];
// 初始化一个NSScanner对象

NSString *text =
@""; // 用来存储查询到的字符串

while (scanner.isAtEnd ==
NO) { // 判断是否扫描完毕

[scanner scanUpToString:@"<"
intoString:nil];
// 查找字符串中的@"<"子串,并将scanLocation停留在@"<"的首个字符的位置上

[scanner scanUpToString:@">"
intoString:&text];
// 查找字符串中的@">"子串,并截取@"<"到@">"的子串(不包括@">")

//
将扫描到的<>中的内容全部替换成@""

str = [str stringByReplacingOccurrencesOfString:[NSString
stringWithFormat:@"%@>", text]
withString:@""];

}

NSLog(@"%@", str);

3.输出所有<>中的内容

NSString *str =
@"我爱你<lal ala>
大发  <大大发>《》<adsfad>asfd";

NSScanner *scanner = [NSScanner
scannerWithString:str];
// 初始化一个NSScanner对象

NSString *text =
@""; // 用来存储查询到的字符串

while (scanner.isAtEnd ==
NO) { // 判断是否扫描完毕

[scanner scanUpToString:@"<"
intoString:nil];
// 查找字符串中的@"<"子串,并将scanLocation停留在@"<"的首个字符的位置上

[scanner
scanString:@"<"
intoString:nil];

[scanner scanUpToString:@">"
intoString:&text];
// 查找字符串中的@">"子串,并截取@"<"到@">"的子串(不包括@">")

NSLog(@"%@",
text);

}

4.从一个字符串中读取出规定的子串

假设你有如下字符串:

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);

}

}

时间: 2024-11-03 21:15:54

学习笔记:NSScanner类的使用的相关文章

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

C++ Primer 学习笔记_55_类与数据抽象 --析构函数

复制控制 --析构函数 引言: 在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源.析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充. 1.何时调用析构函数 撤销类对象时会自动调用析构函数: Sales_item *p = new Sales_item; { Sales_item item(*p); //调用复制构造函数 delete p; //调用指针p的析构函数 } //调用对象item的析构函数 动态分配的对象只有在指向该对象的指针被删除时才撤销,

C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员

类 --友元.static成员 一.友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类(对未被授权的函数或类,则阻止其访问):友元的声明以关键字friend开始,但是它只能出现在类定义的内部.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响. [最佳实践] 通常,将友元声明成组的放在类定义的开始或结尾是个好主意! 1.友元关系:一个例子 假设一个窗口管理类Window_Mgr可能需要访问由其管理的Screen对象的内部

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针 1.引言 在前面提到过,成员函数具有一个附加的隐含形参,即指向该类对象的一个指针.这个隐含形参命名为this. 2.返回*this 成员函数有一个隐含的附加形参,即指向该对象的指针,这个隐含的形参叫做this指针(编译器自动传递)使用this指针保证了每个对象可以拥有不同数值的数据成员,但处理这些成员的代码可以被所有对象共享.成员函数是只读的代码,由所有对象共享,并不占对象的存储空间,因为this指针指向当前对象,所以