學(xué)習(xí)NSScanner
NSScanner是一個類,用于在字符串中掃描指定的字符革屠,尤其是把它們翻譯/轉(zhuǎn)換為數(shù)字和別的字符串凿试。可以在創(chuàng)建NSScaner時指定它的string屬性似芝,然后scanner會按照你的要求從頭到尾地掃描這個字符串的每個字符那婉。
創(chuàng)建一個Scanner
NSScanner是一個類族, NSScanner是其中公開的一類党瓮。通常详炬,可以用scannerWithString:或localizedScannerWithString:方法初始化一個scanner。這兩個方法都返回一個scanner對象并用你傳遞的字符串參數(shù)初始化其string屬性寞奸。剛創(chuàng)建時scanner對象指向字符串的開頭呛谜。scanner方法開始掃描,比如scanInt:枪萄,scanDouble:隐岛,scanString:intoString:。如果你要想掃描多遍瓷翻,通常需要使用while循環(huán)聚凹,
Scanner的使用
掃描操作從上次掃描的位置開始割坠,并且繼續(xù)往后掃描直到指定的內(nèi)容出現(xiàn)為止(如果有的話)。
以字符串“137 small cases of bananas”為例妒牙,在掃描完一個整數(shù)之后彼哼,scanner的位置將變?yōu)?,也即數(shù)字后面的空格處湘今。通常敢朱,你會繼續(xù)掃描并跳過你不關(guān)心的字符。那么你可以用setScanLocation:方法跳過某幾個字符(也可以用這個方法在發(fā)生某些錯誤后象浑,重新開始掃描字符串的某部分)蔫饰。如果你想跳過某種特殊的字符集中的字符時,可以使用setCharactersToBeSkipped:方法愉豺。scanner在任何掃描操作時會跳過空白字符之后才開始。但是當(dāng)它找到一個可以掃描的字符時茫因,它會用全部字符去和指定內(nèi)容匹配蚪拦。scanner默認(rèn)情況下會忽略空白字符和換行符。注意冻押,對于忽略字符驰贷,總是大小寫敏感的。例如要忽略所有原音字母洛巢,你必須使用“AEIOUaeiou”括袒,而不能僅僅是“AEIOU”或“aeiou”。
如果你想獲取當(dāng)前位置的某個字符串的內(nèi)容稿茉,可以使用scanUpToString:intoString:方法(如果你不想保留這些字符锹锰,可以傳遞一個NULL給第2個參數(shù))。
<pre>
/*
以下例子會循環(huán)的搜索字符串中的浮點(diǎn)值漓库,并賦值給aFloat參數(shù)恃慧。這個時候isAtEnd便會緊接上一次搜索到的字符位置繼續(xù)搜索看是否存在下一個浮點(diǎn)值,直至掃描結(jié)束渺蒿。掃描動作的核心就是位置的變動痢士。位置不停地在掃描中移動,直至結(jié)束掃描茂装。
另外怠蹂,還可以通過setCaseSensitive:方法設(shè)置是否忽略大小寫,默認(rèn)是忽略
*/
- (void)test1
{
float aFloat;
NSString * aString = @"1.37 3.44 small cases of bananas";
NSScanner *theScanner = [NSScanner scannerWithString:aString];
[theScanner setCaseSensitive:YES];//是否忽略大小寫
while ([theScanner isAtEnd] == NO) {
[theScanner scanFloat:&aFloat];
NSLog(@"test1");
}
//NSLog(@"aFloat __ %f",aFloat);
}
</pre>
<pre>
/*
查找字符串separatorString為“ of”關(guān)系重大少态。默認(rèn)scanner會忽略空白字符城侧,因此在數(shù)字137后面的空格被忽略。但是當(dāng)scanner從空格后面的字符開始時况增,所有的字符都被加到了輸出字符串中赞庶,一直到遇到搜索字符串(“of”)。
如果搜索字符串是“of”(前面沒空格),container的第一個值應(yīng)該是“smallcases ”(后面有個空格)歧强;如果搜索字符串是“ of”(前面有空格)澜薄,則container的第1個值是“small cases”(后面無空格)。
在掃描到指定字符串(搜索字符串)之后摊册,scanner的位置指向了該字符串開始處肤京。如果你想繼續(xù)掃描該字符串之后的字符,必須先掃描指定字符串(搜索字符串)茅特。下列代碼演示了如何跳過搜索字串并取得產(chǎn)品類型忘分。注意我們使用了substringFromIndex:,等同于繼續(xù)掃描直到整個字符串的末尾白修。
*/
-
(void)test2
{
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];
[aScanner scanString:separatorString intoString:NULL];
NSString *product;
product = [[aScanner string] substringFromIndex:[aScanner scanLocation]];NSLog(@"%d%@%@",anInteger,container,product);
}
</pre>
<pre>
/*
以下代碼演示了讀取產(chǎn)品名稱和價格的操作(價格簡單地讀作一個float)妒峦,跳過“Product:”和“Cost:"子串,以及分號兵睛。注意肯骇,因?yàn)閟canner默認(rèn)忽略空白字符和換行符,循環(huán)中沒有指定對它們的處理(尤其對于讀取末尾的整數(shù)而言祖很,并不需要處理額外的空白字符)笛丙。
*/
-
(void)test3
{
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); }
}
}
</pre>