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

例如从一段字符串中提取出数字

-(int)findNumFromStr

{

NSString *originalString = @"a1b2c3d4e5f6g7h8i9j";

// Intermediate

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

NSString *tempStr;

NSScanner *scanner = [NSScanner scannerWithString:originalString];

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

while (![scanner isAtEnd]) {

// Throw away characters before the first number.

[scanner scanUpToCharactersFromSet:numbers intoString:NULL];

// Collect numbers.

[scanner scanCharactersFromSet:numbers intoString:&tempStr];

[numberString appendString:tempStr];

tempStr = @"";

}

// Result.

int number = [numberString integerValue];

return number;

}

下面是我找的一些关于NSScanner的接口及解释:(下面内容来自转载)

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

创建一个Scanner

NSScanner是一个类族, NSScanner是其中公开的一类。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一个scanner。这两个方法都返回一个scanner对象并用你传递的字符串参数初始化其string属性。刚创建时scanner对象指向字符串的开头。scanner方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要使用while循环,

例如如下代码所示:

?


1

2

3

4

5

6

7

8

9

10

11

float
aFloat; 

   

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

?


1

2

3

4

5

6

7

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:,等同于继续扫描直到整个字符串的末尾。

?


1

2

3

4

5

[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默认忽略空白字符和换行符,循环中没有指定对它们的处理(尤其对于读取末尾的整数而言,并不需要处理额外的空白字符)。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 01:56:33

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

c split 函数 分割字符串 获取指定index的子字符串

char* get_sub_split(char* path,const char* delim,int index) { //static const char *delim = "."; int i = 0; char* p = strtok(path, delim); //printf("i=%d,%s\\n", i,p); if(i==index) { return p; } i++; while((p = strtok(NULL, delim))){ //

iOS 获取UIColor对象的HSB字符串值。

/** *  获取UIColor对象的HSB字符串值. * */ - (NSString *)getHSBStringByColor:(UIColor *)originColor { // Method provided by the Colours class extension NSDictionary *hsbDict = [self getHSBAValueByColor:originColor]; return [NSString stringWithFormat:@"(%0.2f,

李洪强iOS开发之动态获取UILabel的bounds

李洪强iOS开发之动态获取UILabel的bounds 在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度  CGSize labelBounds = [str sizeWithFont:font constrainedToSize:CGSizeMake(MAXFLOAT, 30)]; 注:如果想得到宽度的话,size的width应该设为MAXFLOAT. 2.获取高度,获取字符串在指定的siz

ios设备唯一标识获取策略

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for

iOS开发中16进制颜色(html颜色值)字符串转为UIColor

//16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString *cString = [[stringToConvert stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; // String should be

c#获取url中的查询字符串参数

/// <summary> /// 获取url中的查询字符串参数 /// </summary> public static NameValueCollection ExtractQueryParams(string url) { int startIndex = url.IndexOf("?"); NameValueCollection values = new NameValueCollection(); if (startIndex <= 0) ret

如何用js获取浏览器URL中查询字符串的参数

首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主机名和当前的URL的端口号.本博客首页返回www.cnblogs.com hostname:设置或返回当前URL的主机名.本博客首页返回www.cnblogs.com hash:设置或返回从井号(#)开始的URL(锚).本博客首页返回 空 pathname:设置或返回当前URL的路径部分.本博客首页

字符串获取类、封装检测数字的方法

1.charAt()方法: 从整个字符串中找到某子字符,即返回指定位置的字符.charAt(str.length).里面的数字最大为字符串长度减一 eg:stringObject.charAt(index):如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串 var str = '妙味课堂'; var str = '妙味课堂'; // alert( str.length ); // alert( str.charAt() ); //默认为第0个 //

Use GraceNote SDK in iOS(二)获取音乐的完整信息

在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,终于完成了在iOS上通过音乐的部分信息获取完整信息的功能了.(好吧,我承认是相对完整...) 首先介绍下在项目中配置GraceNote的iOS SDK. SDK的下载地址:Mobile Client 注意要先登录才能见到文件的下载链接.另外官网还给出来一个SDK的配置文档,完全跟着走在Xcode 5是走不通的,不过也具有一定的指导作用,建议看一看. 下载解压后,新建一个工程,