NSScanner是一個類,用於在字符串中掃描指定的字符,一般是將他們轉換成數字和別的字符串。咱們能夠在建立NSScanner時指定它的string屬性,而後scanner會按照咱們的要求從頭至尾掃描這個字符串的每一個字符。app
建立一個NSScannerspa
NSScanner是一個類族,一般咱們可使用scannerWithString或locallzedScannerWithString方法初始化一個scanner。這兩個方法都返回一個scanner對象,並用咱們傳遞的字符串參數初始化其string屬性。剛建立的scanner對象指向字符串的開頭。scanner方法開始掃描,好比有:scanInt、scanDouble、scanString:intoString。示例代碼以下:3d
int val; NSScanner *theScanner = [NSScanner scannerWithString:aString]; while([theScanner isAtEnd] == NO) { [theScanner scanInt:&val]; }
以上例子會循環搜索字符串中的整型值,並賦值給val參數。isAtEnd方法會緊接上一次搜索到的字符位置繼續搜索,看是否存在下一個整型值,直到掃描結束。掃描的核心是字符位置的移動,位置在不停的掃描中移動,直至掃描結束。code
Scanner的使用對象
以字符串「132 panda lxl of apple」爲例,在掃描完一個整數以後,scanner的位置將變成3,也便是數字後面的空格處。scanner在任何操做時會跳過空白字符以後纔開始,當它找到一個能夠掃描的字符時,它會用所有字符去和指定內容匹配,scanner默認狀況下會忽略空白字符和換行符。ip
舉個實際例子:132 fushi pingguo of apple字符串
下面的代碼能夠找出蘋果的數量(132)和名稱(fushi)。string
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的位置指向了該字符串的開始處。此時,若是咱們想繼續掃描該字符串以後的字符,則同上面同樣,必須先掃描指定字符串(搜索字符串)。下面的代碼演示瞭如何跳過搜索字符串並取得產品類型,代碼以下:it
[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;
}