NSScanner 的使用

NSScanner类用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的

string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。

创建一个Scanner

NSScanner是一个类族, NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化

一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向

字符串的开头。scan...方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要

使用while循环,例如如下代码所示:

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

可以通过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读取text文档

NSString *tmp;

NSArray *lines;

lines = [[NSString    stringWithContentsOfFile:@"testFileReadLines.txt"]

componentsSeparatedByString:@”\n”];

NSEnumerator *nse = [lines objectEnumerator];//创建一个枚举器

// 读取<>里的内容

while(tmp = [nse nextObject]) {

NSString *stringBetweenBrackets = nil;

NSScanner *scanner = [NSScanner scannerWithString:tmp];

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

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

[scanner scanUpToString:@">" intoString:&stringBetweenBrackets];

NSLog([stringBetweenBrackets description]);

}

时间: 2024-09-30 10:55:02

NSScanner 的使用的相关文章

学习笔记:NSScanner类的使用

NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符. 属性: @property (readonly, copy) NSString *string; // 初始化时赋给NSScanner的字符串 @property NSUInteger scanLocation;  // NSScanner扫描的起始位置 @property

NSScanner知悉 (转)

http://blog.csdn.net/likendsl/article/details/7974761 NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符. 创建一个Scanner NSScanner是一个类族, NSScanner是其中公开的一类.通常,可以用scannerWithString:或localizedScan

iOS开发 - NSScanner的使用方法

NSScanner这个类,用于在字符串中扫描指定的字符. 能够在创建NSScanner时指定它的string属性.然后scanner会依照要求从头到尾地扫描这个字符串中的每一个字符.扫描动作会使扫描仪从头到尾在字符串中移动.直到扫描完整个字符串或扫描到指定的内容. 扫描停止后,扫描仪的位置并不会被置为字符串開始的位置. 下一次的扫描操作将会从上一次扫描停止的位置開始.在必要的情况下能够手动操作.scanLocation来指定扫描開始的位置. NSString *bananas = @"123.3

iOS中的字符串扫描类NSScanner

新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> #define RGBA_COLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:A] #define RGB_COLOR(R, G, B) [UIColor co

综合出现NSScanner: nil string argument libc++abi.dylib: terminat错误的解决方案

在开发中出现了这个错误,断点查找很久,没找到问题所在的代码,google下,发现了下面这几点会产生这个错误: 首先,顾名思义,错误原因是我们在调用某个方法的时候,传入了一个空字符串(注意区别于字符串内容为空)作为方法参数. 对某一个空数组使用objectAtIndex方法.不会报数组越界的错,而是NSScanner: nil string argument. 经过检查,我代码中如果字符串赋值,我一般都对nil做了一定处理,用@""代替,也未有数组越界,但是还是报这样的错误. 现在的信息

NSString+URLParser NSScanner

@implementation NSString (URLParser) -(NSDictionary*)parserToDict { NSScanner *scanner = [NSScanner scannerWithString:self]; [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?="]]; NSString *key; NSStri

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

例子:  NSString * numStr = [@"0x110" substringFromIndex:2]; unsigned long long result = 0; NSScanner *scanner = [NSScanner scannerWithString:numStr]; [scanner scanHexLongLong:&result]; NSLog(@"result - - %lld",result); 参考网址:http://bl

ios NSScanner 扫描字符串获取相应的需要的字符串

例如从一段字符串中提取出数字 -(int)findNumFromStr { NSString *originalString = @"a1b2c3d4e5f6g7h8i9j"; // Intermediate NSMutableString *numberString = [[[NSMutableString alloc] init] autorelease]; NSString *tempStr; NSScanner *scanner = [NSScanner scannerWith

出现NSScanner: nil string argument libc++abi.dylib: terminate_handler unexpectedly threw an exception

出现了 2015-04-04 20:12:51.501 Pan大夫[5001:299704] NSScanner: nil string argument 2015-04-04 20:12:51.502 Pan大夫[5001:299704] NSScanner: nil string argument libc++abi.dylib: terminate_handler unexpectedly threw an exception 的错误信息的总结: 出现了这种错误我当时实在找不到好的方法,后