Scanner類參考 – iPhone手機開發技術文章 iPhone軟體開發教學課程

 

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。

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *