scanUpTochar string 区别和scanchar string 区别的区别

NSScanner&用法
NSScanner类用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的
string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。
创建一个Scanner
NSScanner是一个类族,&NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化
一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向
字符串的开头。scan...方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要
使用while循环,例如如下代码所示:
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&anI
[aScanner&scanInteger:&anInteger];
NSString&*
[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&=&[[aScanner&string]&substringFromIndex:[aScanner&scanLocation]];
//&could&also&use:
//&product&=&[bananas&substringFromIndex:[aScanner&scanLocation]];
假设你有如下字符串:
Product:&Acme&Potato&P&Cost:&0.98&73
Product:&Chef&Pierre&Pasta&F&Cost:&0.75&19
Product:&Chef&Pierre&C&Cost:&1.27&2
以下代码演示了读取产品名称和价格的操作(价格简单地读作一个float),跳过“Product:”和“Cost:"子串,以及分号。注意,因为
scanner默认忽略空白字符和换行符,循环中没有指定对它们的处理(尤其对于读取末尾的整数而言,并不需要处理额外的空白
NSString&*string&=&@"Product:&Acme&Potato&P&Cost:&0.98&73\n\
Product:&Chef&Pierre&Pasta&F&Cost:&0.75&19\n\
Product:&Chef&Pierre&C&Cost:&1.27&2\n";
NSCharacterSet&*semicolonS
NSScanner&*theS
NSString&*PRODUCT&=&@"Product:";
NSString&*COST&=&@"Cost:";
NSString&*productN
float&productC
NSInteger&productS
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&*
NSArray&*&
lines&=&[[NSString&&&&stringWithContentsOfFile:@"testFileReadLines.txt"]
&&&&&&&&&&&&&&&componentsSeparatedByString:@”\n”];
&NSEnumerator&*nse&=&[lines&objectEnumerator];//创建一个枚举器
&//&读取&&里的内容
&while(tmp&=&[nse&nextObject])&{
&&&&&&&&&&NSString&*stringBetweenBrackets&=&
&&&&&&&&&&NSScanner&*scanner&=&[NSScanner&scannerWithString:tmp];
&&&&&&&&&&[scanner&scanUpToString:@"&"&intoString:nil];
&&&&&&&&&&[scanner&scanString:@"&"&intoString:nil];
&&&&&&&&&&[scanner&scanUpToString:@"&"&intoString:&stringBetweenBrackets];
&&&&&&&&&&NSLog([stringBetweenBrackets&description]);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。5325人阅读
&假设我们查找某个关键字(比如:【来自网易邮箱的超大附件】)在某段文本中的位置。这段文本的内容是不固定,它可能是这样的:&【来自网易邮箱的超大附件】提示:邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。&也可能是这样的:&开其说颇参差,而皆近於附会,故黄宗羲至诋为经纬混淆,行度无稽。【来自网易邮箱的超大附件】提示:邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。&还有可能根本不包含关键字:&achartengine&绘制统计图是 就一个系类& 能让这个系类中每个柱形图的颜色都不一样吗&我们需要把关键字“【来自网易邮箱的超大附件】”之后的内容统统删除,只保留位于关键字之前的内容,比如第一段文字变成了空或者第二段文本只留下以下文字:&开其说颇参差,而皆近於附会,故黄宗羲至诋为经纬混淆,行度无稽。&这个任务可以用NSScanner来做,如以下代码片段:&-(NSString*)extractBodyFromMessage:(NSString* )msg{&&& NSString* body=&&& NSString* keyString=@&【来自网易邮箱的超大附件】&;&&& NSScanner*scanner=[NSScanner scannerWithString:body];&&& [scannersetCaseSensitive:NO];&&& BOOL&&& while (![scanner isAtEnd]){&&&&&&& b=[scannerscanString:keyString intoString:NULL];&&&&&&& if(b) {&&&&&&&&&&&body=[body substringToIndex:[scanner scanLocation]-keyString.length];&&&&&&&&&&&&&&&&&&}else{&&&&&&&&&&&scanner.scanLocation++;&&&&&&& }&&& }&&&}&在while循环里面,我们首先从0位置开始扫描指定关键字,如果未找到,移动scanLocation位置,继续从下一字符查找直至文本末尾;如果找到,直接返回子字符串。有人会觉得用scanUpToString代替scanString会更好。因为,scanUpToString在找到指定文本(keyString)后,会将scanLocation停止在keyString之前(scanString方法会将scanLocation移到keyString之后位置),这样我们的substringToIndex:方法就不必再用scanLocation减去keyString的长度了:&body=[bodysubstringToIndex:[scanner scanLocation]];&你可以试试,用scanUpToString替换scanString,并将substringToIndex:一句改成上面的语句,会是什么结果。对于第一段文本来说,结果会是:&【来自网易邮箱的超大附件】提示:邮件带有附件预览链接,若您转发或回复此邮件时不希望对方预览附件,建议您手动删除链接。&似乎scanner并没有找出keyString关键字。为什么?因为API文档里面说:&If stopStringis the first string in the receiver, then the method returns NO and stringValue is not changed.&如果scanUpToString在文本的开头(第一个字符)就找到目标文本,会返回NO,stringValue不会改变。&对于第一段文字来说,keyString就在文本的开头。因此scanUpToString虽然找到了keyString,但它仍然返回NO,并且scanLocation是0。于是从第2个字符又继续查找。结果当然是找不到,一直到最后一个字符之前,然后scanLocation++,scanLocation变成了最后一个字符的索引。&对于第二段和第三段文本,scanUpToString得到的结果倒是和scanString是一致的。没有什么问题。这是因为API文档中说了:&If stopStringis present in the receiver, then on return the scan location is set to thebeginning of that string.If the search string (stopString) isn't present in the scanner's source string, theremainder of the source string is put into stringValue, the receiver’s scanLocation is advanced to the end of thesource string, and the method returns YES.&如果目标文本在receiver文本中被找到,返回YES并将scanLocation设置到已找到的目标文本之前。如果目标文本未找到,从本次查找开始剩下的整个receiver文本被放入stringValue,scanLocation移动到源串的末尾,返回YES。&很显然,对于scanUpToString和scanString的区别,最主要的就在第一种情况上。如果目标文本一开头就出现目标文本(scanner默认是忽略空格和换行的,因此如果开头有这两个空白字符,scanner视若未见),二者将得到完全不同的结果:scanString会返回YES,而scanUpToString返回NO。&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2422732次
积分:25481
积分:25481
排名:第114名
原创:238篇
译文:121篇
评论:1331条
难度:高级
类型:技术教程
阅读:21030
阅读:39567
阅读:44298
阅读:67303
阅读:122635
(4)(5)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(5)(4)(5)(5)(6)(9)(5)(6)(4)(5)(5)(5)(5)(5)(4)(5)(5)(5)(6)(5)(3)(6)(5)(5)(6)(5)(6)(6)(3)(6)(8)(8)(5)(8)(8)(9)(4)(8)(10)(10)(10)(10)(11)(6)(4)(4)(8)(5)(5)(1)(3)(3)(1)(10)(2)(2)(1)(2)(2)15079人阅读
NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。&
创建一个Scanner&
NSScanner是一个类族, NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向字符串的开头。scanner方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要使用while循环,
例如如下代码所示:
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 anI
[aScanner scanInteger:&anInteger];
NSString *
[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 = [[aScanner string] substringFromIndex:[aScanner scanLocation]];
// could also use:
// product = [bananas substringFromIndex:[aScanner scanLocation]];&
假设你有如下字符串:
Product: Acme Potato P Cost: 0.98 73
Product: Chef Pierre Pasta F Cost: 0.75 19
Product: Chef Pierre C Cost: 1.27 2
以下代码演示了读取产品名称和价格的操作(价格简单地读作一个float),跳过“Product:”和“Cost:&子串,以及分号。注意,因为scanner默认忽略空白字符和换行符,循环中没有指定对它们的处理(尤其对于读取末尾的整数而言,并不需要处理额外的空白字符)。
NSString *string = @&Product: Acme Potato P Cost: 0.98 73\n\
Product: Chef Pierre Pasta F Cost: 0.75 19\n\
Product: Chef Pierre C Cost: 1.27 2\n&;
NSCharacterSet *semicolonS
NSScanner *theS
NSString *PRODUCT = @&Product:&;
NSString *COST = @&Cost:&;
NSString *productN
float productC
NSInteger productS
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。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:908685次
积分:9963
积分:9963
排名:第808名
原创:123篇
转载:115篇
译文:10篇
评论:95条
(1)(7)(2)(3)(2)(3)(2)(15)(2)(3)(1)(2)(7)(4)(2)(1)(1)(5)(6)(4)(9)(10)(11)(13)(4)(3)(15)(9)(8)(58)(18)(14)(1)(1)

我要回帖

更多关于 char string 区别 的文章

 

随机推荐