學(xué)習(xí)NSScanner

學(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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市假颇,隨后出現(xiàn)的幾起案子胚鸯,更是在濱河造成了極大的恐慌,老刑警劉巖笨鸡,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姜钳,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜豹,警方通過查閱死者的電腦和手機(jī)傲须,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟脂,“玉大人泰讽,你說我怎么就攤上這事∥羝冢” “怎么了已卸?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硼一。 經(jīng)常有香客問我累澡,道長,這世上最難降的妖魔是什么般贼? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任愧哟,我火速辦了婚禮奥吩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕊梧。我一直安慰自己霞赫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布肥矢。 她就那樣靜靜地躺著端衰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘改。 梳的紋絲不亂的頭發(fā)上旅东,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音十艾,去河邊找鬼抵代。 笑死,一個胖子當(dāng)著我的面吹牛疟羹,可吹牛的內(nèi)容都是我干的主守。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榄融,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了救湖?” 一聲冷哼從身側(cè)響起愧杯,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞋既,沒想到半個月后力九,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邑闺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年跌前,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陡舅。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抵乓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶衍,到底是詐尸還是另有隱情灾炭,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布颅眶,位于F島的核電站蜈出,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涛酗。R本人自食惡果不足惜铡原,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一偷厦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧燕刻,春花似錦只泼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忌怎,卻和暖如春籍滴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榴啸。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工孽惰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸥印。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓勋功,卻偏偏與公主長得像,于是被迫代替她去往敵國和親库说。 傳聞我的和親對象是個殘疾皇子狂鞋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • NSScanner是一個類,用于在字符串中掃描指定的字符潜的,尤其是把它們翻譯/轉(zhuǎn)換為數(shù)字和別的字符串骚揍。可以在創(chuàng)建NS...
    踐行者閱讀 1,904評論 0 2
  • 掃描儀相關(guān)鏈接:https://developer.apple.com/library/archive/docum...
    ngugg閱讀 150評論 0 0
  • NSScanner類是一個類簇的抽象父類,該類簇為一個從NSString對象掃描值的對象提供了程序接口啰挪。 NSSc...
    以技術(shù)之名閱讀 6,002評論 4 39
  • NSScanner類是 一個類簇的抽象父類信不,該類為一個從nsstring對象掃描值的對象提供了程序接口; NSSc...
    小心眼虎虎閱讀 2,351評論 0 1
  • NSScanner類 最近做項(xiàng)目亡呵,遇到了這個類抽活,所以找了資料看了看,以后再加例子锰什。一下硕、屬性 NSScanner對象...
    邊河閱讀 663評論 0 0