1. 程式人生 > >iOS NSScanner類的基本用法詳解

iOS NSScanner類的基本用法詳解

簡介

NSScanner是一個類,用於在字串中掃描指定的字元,尤其是把它們翻譯/轉換為數字和別的字串。可以在建立NSScaner時指定它的string屬性,然後scanner會按照你的要求從頭到尾地掃描這個字串的每個字元。

NSScanner類是一個類簇的抽象父類,該類簇為一個從NSString物件掃描值的物件提供了程式介面。
NSScanner物件把NSString 物件的的字元解釋和轉化成 number和string 型別的值。在建立NSScanner物件的時候為它分配字元(string ),當你從NSScanner物件獲取內容的時候,它會從頭到尾遍歷字串(string)。
由於類簇的屬性, scanner物件並不是 NSScanner類的例項,而是它一個私有子類的例項。儘管scanner物件的類是私有的,但是它的介面是公開的(抽象父類已經宣告)。 NSScanner 的原始方法是string和

Configuring a Scanner方法下面列舉的所有的方法。
在 NSScanner 物件掃描字串的時候,你可以通過設定屬性charactersToBeSkipped忽略某些字元。在掃描字串之前,那些位於忽略字符集中的字元將會被跳過。預設的忽略字元是空格和回車字元。
可以通過[[scanner string] substringFromIndex:[scanner scanLocation]]獲取未掃描的字串。

Scanner建立

NSScanner是一個類族, NSScanner是其中公開的一類。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一個scanner。

+ (instancetype)scannerWithString:(NSString *)aString
+ (id)localizedScannerWithString:(NSString *)aString
- (instancetype)initWithString:(NSString *)aString
  • scannerWithString,返回值是 掃描過aString字串的NSScanner 物件,該方法通過呼叫initWithString設定掃描字串;
  • localizedScannerWithString,返回值是 通過使用者預設的 locale方式掃描字串的NSScanner 物件,該方法也是通過呼叫initWithString設定掃描字串;
  • initWithString,返回值是NSScanner 物件,該物件通過掃描aString完成初始化

屬性詳解

@property(readonly, copy) NSString *string
@property NSUInteger scanLocation
@property BOOL caseSensitive
@property(copy) NSCharacterSet *charactersToBeSkipped
@property(retain) id locale
  • scanLocation,下次掃描開始的位置,如果該值超出了string的區域,將會引起NSRangeException,該屬性在發生錯誤後重新掃描時非常有用。(這個方法不是隻讀的,可自定義掃描位置)
  • caseSensitive,是否區分字串中大小寫的標誌。預設為NO,注意:該設定不會應用到被跳過的字符集。
  • charactersToBeSkipped,在掃描時被跳過的字符集,預設是空白格和回車鍵。被跳過的字符集優先於掃描的字符集:例如一個scanner被跳過的字符集為空格,通過scanInt:去查詢字串中的整型數時,首先做的不是掃描,而是跳過空格,直到找到十進位制資料或者其他的字元。在字元被掃描的時候,跳過功能就失效了。如果你掃描的字元和跳過的字元是一樣的,結果將是未知的。被跳過的字元是一個唯一值,scanner不會將忽略大小寫的功能應用於它,也不會用這些字元做一些組合,如果在掃描字元換的時候你想忽略全部的母音字元,就要這麼做(比如:將字符集設定成“AEIOUaeiou”};
  • locale,scanner 的locale對它從字串中區分數值產生影響,它通過locale的十進位制分隔符區分浮點型資料的整數和小數部分。一個沒有locale的scanner用非定域值。新的scanner若沒有設定locale,使用預設locale。

方法詳解

- (BOOL)scanCharactersFromSet:(NSCharacterSet *)scanSet   intoString:(NSString * _Nullable *)stringValue;
- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)stopSet    intoString:(NSString * _Nullable *)stringValue;
- (BOOL)scanString:(NSString *)string  intoString:(NSString * _Nullable *)stringValue;
- (BOOL)scanUpToString:(NSString *)stopString   intoString:(NSString * _Nullable *)stringValue;
- (BOOL)scanDecimal:(NSDecimal *)decimalValue;
- (BOOL)scanDouble:(double *)doubleValue;
- (BOOL)scanFloat:(float *)floatValue;
- (BOOL)scanHexDouble:(double *)result;
- (BOOL)scanHexFloat:(float *)result;
- (BOOL)scanHexInt:(unsigned int *)intValue;
- (BOOL)scanHexLongLong:(unsigned long long *)result;
- (BOOL)scanInt:(int *)intValue;
- (BOOL)scanInteger:(NSInteger *)value;
- (BOOL)scanUnsignedLongLong:(unsigned long long *)unsignedLongLongValue;
@property(getter=isAtEnd, readonly) BOOL atEnd;

  • scanCharactersFromSet:intoString:掃描字串中和NSCharacterSet字符集中匹配的字元,是按字元單個匹配的,例如,NSCharacterSet字符集為@”test123Dmo”,scanner字串為 @” 123test12Demotest”,那麼字串中所有的字元都在字符集中,所以指標指向的地址儲存的內容為”123test12Demotest”
  • scanUpToCharactersFromSet:intoString:掃描字串直到遇到NSCharacterSet字符集的字元時停止,指標指向的地址儲存的內容為遇到跳過字符集字元之前的內容
  • scanString:intoString:從當前的掃描位置開始掃描,判斷掃描字串是否從當前位置能掃描到和傳入字串相同的一串字元,如果能掃描到就返回YES,指標指向的地址儲存的就是這段字串的內容。例如scanner的string內容為123abc678,傳入的字串內容為abc,如果當前的掃描位置為0,那麼掃描不到,但是如果將掃描位置設定成3,就可以掃描到了。
  • scanUpToString:intoString:從當前的掃描位置開始掃描,掃描到和傳入的字串相同字串時,停止,指標指向的地址儲存的是遇到傳入字串之前的內容。例如scanner的string內容為123abc678,傳入的字串內容為abc,儲存的內容為123
  • scanDecimal:掃描NSDecimal型別的值,有關NSDecimal型別的值更多的資訊可以檢視:NSDecimalNumber
  • scanDouble :掃描雙精度浮點型字元,溢位和非溢位都被認為合法的浮點型資料。在溢位的情況下scanner將會跳過所有的數字,所以新的掃描位置將會在整個浮點型資料的後面。double指標指向的地址儲存的資料為掃描出的值,包括溢位時的HUGE_VAL或者 –HUGE_VAL,即未溢位時的0.0。
  • scanFloat:掃描單精度浮點型字元,具體內容同scanDouble
  • scanHexDouble: 掃描雙精度的十六進位制型別,溢位和非溢位都被認為合法的浮點型資料。在溢位的情況下scanner將會跳過所有的數字,所以新的掃描位置將會在整個浮點型資料的後面。double指標指向的地址儲存的資料為掃描出的值,包括溢位時的HUGE_VAL或者 –HUGE_VAL,即未溢位時的0.0。資料接收時對應的格式為 %a 或%A ,雙精度十六進位制字元前面一定要加 0x或者 0X。
  • scanHexInt 掃描十六進位制無符整型,unsigned int指標指向的地址值為 掃描到的值,包含溢位時的UINT_MAX。
  • scanHexLongLong 同scanHexDouble
  • scanInt 掃描整型,溢位也被認為是有效的整型,int 指標指向的地址的值為掃描到的值,包含溢位時的INT_MAX或INT_MIN。
  • scanInteger 同scanInt
  • scanLongLong 掃描LongLong 型,溢位也被認為是有效的整型,LongLong指標指向的地址的值為掃描到的值,包含溢位時的LLONG_MAX 或 LLONG_MIN。

Scanner使用

NSScanner這個類,用於在字串中掃描指定的字元。可以在建立NSScanner時指定它的string屬性,然後scanner會按照要求從頭到尾地掃描這個字串中的每個字元。掃描動作會使掃描器從頭到尾在字串中移動,直到掃描完整個字串或掃描到指定的內容。
掃描停止後,掃描器的位置並不會被置為字串開始的位置。下一次的掃描操作將會從上一次掃描停止的位置開始。scanLocation來指定掃描開始的位置, charactersToBeSkipped是來指定不需要掃描的字元的.
   NSString *bananas = @"123.321abc137d efg/hij kl";
    NSString *separatorString = @"fg";
    BOOL result;

    NSScanner *aScanner = [NSScanner scannerWithString:bananas];

    //掃描字串
    //掃描到指定字串時停止,返回結果為指定字串之前的字串
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    NSString *container;
    result = [aScanner scanUpToString:separatorString intoString:&container];
    NSLog(@"掃描成功:%@", [email protected]"YES":@"NO");
    NSLog(@"掃描的返回結果:%@", container);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);

    //掃描整數
    //將會接著上一次掃描結束的位置繼續掃描
    NSLog(@"-------------------------------------1");
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    NSInteger anInteger;
    result = [aScanner scanInteger:&anInteger];
    NSLog(@"掃描成功:%@", [email protected]"YES":@"NO");
    NSLog(@"掃描的返回結果:%ld", anInteger);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);

    //掃描整數
    //將掃描器的位置置為首位置
    //掃描器預設會接著上一次掃描結束的位置開始掃描,而不是重新從首位置開始
    //當掃描到一個不是整數的字元時將會停止掃描(如果開始掃描的位置不為整數,則會直接停止掃描)
    NSLog(@"-------------------------------------2");
    aScanner.scanLocation = 0;      //將掃描器的位置置為首位置
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    NSInteger anInteger2;
    result = [aScanner scanInteger:&anInteger2];
    NSLog(@"掃描成功:%@", [email protected]"YES":@"NO");
    NSLog(@"掃描的返回結果:%ld", anInteger2);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);

    //掃描浮點數
    //當掃描到一個不是整數的字元時將會停止掃描(如果開始掃描的位置不為整數,則會直接停止掃描)
    NSLog(@"-------------------------------------3");
    aScanner.scanLocation = 0;      //將掃描器的位置置為首位置
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    float aFloat;
    result = [aScanner scanFloat:&aFloat];
    NSLog(@"掃描成功:%@", [email protected]"YES":@"NO");
    NSLog(@"掃描的返回結果:%f", aFloat);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);

    NSLog(@"-------------------------------------4");
    NSLog(@"所掃描的字串:%@", aScanner.string);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    NSLog(@"是否掃描到末尾:%@", [email protected]"YES":@"NO");


    NSLog(@"-------------------------------------5");
    aScanner.scanLocation = 0;      //將掃描器的位置置為首位置
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);
    NSString *str;
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"/"];
    result = [aScanner scanUpToCharactersFromSet:characterSet intoString:&str];
    NSLog(@"掃描成功:%@", [email protected]"YES":@"NO");
    NSLog(@"掃描的返回結果:%@", str);
    NSLog(@"掃描器所在的位置:%lu", aScanner.scanLocation);

列印結果:

這裡寫圖片描述

例1:掃描數字

    NSString * numStr = @"a 1 b 2 c 3 d 4 e 5 f 6 o";
    NSScanner * scanner = [NSScanner scannerWithString:numStr];
    NSCharacterSet * numSet = [NSCharacterSet decimalDigitCharacterSet];
    while ( NO == [scanner isAtEnd]) {
        if ([scanner scanUpToCharactersFromSet:numSet intoString:NULL]) {
            int num;
            if ([scanner scanInt:&num]) {
                NSLog(@"num=%d, %ld",num, scanner.scanLocation);
            }
        }
    }

列印結果:

這裡寫圖片描述

例2:過濾數字

  NSString * numStr = @"a 1 b 2 c 3 d 4 e 5 f 6 o";
    NSScanner * scanner = [NSScanner scannerWithString:numStr];
    //預設情況下,掃描器會跳過所有空格符和換行符。但這裡我們希望跳過數字
        NSCharacterSet * numSet = [NSCharacterSet decimalDigitCharacterSet];
    scanner.charactersToBeSkipped = numSet;
    while ( NO == [scanner isAtEnd]) {
        if ([scanner scanUpToCharactersFromSet:numSet intoString:NULL]) {
            int num;
            if ([scanner scanInt:&num]) {
                NSLog(@"num=%d, %ld",num, scanner.scanLocation);
            }else{
                NSLog(@"無結果");
            }
        }
    }

列印結果:
這裡寫圖片描述

例3

假設你有如下字串:
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\
    \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);  
        }  
    }

列印結果:
這裡寫圖片描述

相關推薦

iOS NSScanner基本用法

簡介 NSScanner是一個類,用於在字串中掃描指定的字元,尤其是把它們翻譯/轉換為數字和別的字串。可以在建立NSScaner時指定它的string屬性,然後scanner會按照你的要求從頭到尾地掃描這個字串的每個字元。 NSScanner類是一個類簇的抽象父類,該類簇

常見<meta>的基本用法

代碼 簡介 clas 元素 word spa wid min mpat <meta charset="utf-8"> 定義與name 屬性相關的信息,使用 utf-8編碼方式編譯字符 <meta http-equiv="X-UA-Compatible" c

Python模塊中requests模塊的基本用法

python CTF 首先還是老生長談,說說定義和作用,request模塊是一個用於訪問網絡的模塊,其實類似的模塊還有很多,不在一一在這裏解釋。這麽多的相似的模塊為什麽都說只有這個好用呢。因為他人性化。如果你學過urllib之類的模塊的話,對比一下就很清楚了(文章url以題目實

JAVA的Random用法

Random類 (java.util)         Random類中實現的隨機演算法是偽隨機,也就是有規則的隨機。在進行隨機時,隨機演算法的起源數字稱為種子數(seed),在種子數的基礎上進行一定的變換,從而產生

linux中mariadb基本用法(企業級)

資料庫 表的每一個列名字的頭   叫做欄位 是高階的exel表格軟體 資料庫種類 sqlserver  sqllite  db2   oracle  > mysql   比較多   其中my

Python 3.7.1 中 namedtuple 具名元組基本用法

Python 3.7.1 中 namedtuple 具名元組基本用法詳解 轉載請註明出處:https://blog.csdn.net/jpch89/article/details/84645251 文章目錄 Python 3.7.1 中 namedtupl

adb 和 fastboot 的基本用法

你也可以檢視我的其他同類文章,也會讓你有一定的收貨! 使用方法: 下載附件解壓到D盤 在我的電腦圖示上點右鍵,然後依次點選下列專案:屬性->高階->環境變數,會彈出環境變數視窗 選中名字是PATH的那行,雙擊它,會彈出編輯使用者變數視窗

【Android】SQLite資料庫基本用法(極簡潔)

    Android操作SQLite資料庫(極簡潔,極易懂) 本篇原始碼地址: 原始碼裡面有詳細註釋,切記要修改一下gradle的版本號為本地gradle版本號,否則AndroidStduio會自行下載,浪費時間。 一、成品效果圖 Android

kotlin的基本用法

基本用法 1.常量和變數 使用val關鍵字宣告一個常量(只讀,不可修改),使用var關鍵字宣告一個變數,下面是具體用法: 1. fun test() { 2. //使用val關鍵字宣告一個常量(只讀),宣告常量時必須初始化 3.

PL/SQL DEVELOPER 基本用法(轉)

PL/SQL DEVELOPER 基本用法詳解(建議寫過第一個儲存過程後的初手必讀)   用過oracle的都抱怨,為了穩定 它提供的圖形化操作 速度慢的讓人傷心呀,p4+128M的機器只要啟動一個   oracle服務就夠讓人傷心的,再在dba studio裡面操作真能讓人

vector 基本用法

vector是STL中最常見的容器,它是一種順序容器,支援隨機訪問。 vector是一塊連續分配的記憶體,從資料安排的角度來講,和陣列極其相似, 不同的地方就是:陣列是靜態分配空間,一旦分配了空間的大小,就不可再改變了; 而vector是動態分配空間,隨著元素的不斷插入,

Java學習筆記之Pattern用法 (正則表示式)

Implements: Serializable 正則表示式的編譯表示形式。 指定為字串的正則表示式必須首先被編譯為此類的例項。然後,可將得到的模式用於建立 Matcher 物件,依照正則表示式,該物件可以與任意字元序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,

Python數據型方法簡介一————字符串的用法

python 字符串連接 字符串用法 符串是Python中的重要的數據類型之一,並且字符串是不可修改的。 字符串就是引號(單、雙和三引號)之間的字符集合。(字符串必須在引號之內,引號必須成對)註:單、雙和三引號在使用上並無太大的區別; 引號之間可以采取交叉使用的方式避免過多轉義;

iOS、元、isa

exit argv tst eth program ram 通過 classname TE 類相信大家都知道是什麽,如果看過runtime的源碼或者看過相關的文章對isa肯定也不陌生,不過元類(meta class)大家可能就比較陌生了。不過大家也不要擔心,我會細細道來,讓

Python 基本定義

【摘要】Python是一種面向物件的語言,稍微複雜一點的程式,都應該採用類來進行設計,以使程式結構更加清晰,易於把控。本文將討論單類的基本內容定義,以後的博文再討論其它。   一. 成員的訪問範圍: Python中的類,其實就是執行程式碼塊,這一點很重要,所有位於 class

C++通過jsoncpp庫讀寫JSON檔案-json用法

介紹: JSON 是常用的資料的一種格式,各個語言或多或少都會用的JSON格式。 JSON是一個輕量級的資料定義格式,比起XML易學易用,而擴充套件功能不比XML差多少,用之進行資料交換是一個很好的選擇。JSON的全稱為:JavaScript Object Notation ,顧名思義,JSON是用於標記

C++通過jsoncpp庫讀寫JSON文件-json用法

null 鏈接 reading port 舉例 格式 www. json格式 eno 介紹: JSON 是常用的數據的一種格式,各個語言或多或少都會用的JSON格式。 JSON是一個輕量級的數據定義格式,比起XML易學易用,而擴展功能不比XML差多少,用之進行數據交換是一個

iOS中nil、Nil、NULL和NSNull的理解和用法

nil 這個也是條件編譯的,那麼對於我們Objective-C開發來說,nil就代表((void *)0)。 我們使用nil表示Objective-C物件為空,如NSString *str = nil。 我們給物件賦值時一般會使用object = nil,表示我想把這個物件釋放掉;

java中ArrayList用法基本用法(含增刪改查)

1、什麼是ArrayList ArrayList就是動態陣列,它提供了①動態的增加和減少元素 ②實現了ICollection和IList介面 ③靈活的設定陣列的大小ArrayList是一個其容量能夠動態增長的動態陣列。它繼承了AbstractList,實現了List、Rand

C++友元函式和友元用法

在C++中,我們使用類對資料進行了隱藏和封裝,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式