iOS NSScanner類的基本用法詳解
簡介
NSScanner是一個類,用於在字串中掃描指定的字元,尤其是把它們翻譯/轉換為數字和別的字串。可以在建立NSScaner時指定它的string屬性,然後scanner會按照你的要求從頭到尾地掃描這個字串的每個字元。
NSScanner類是一個類簇的抽象父類,該類簇為一個從NSString物件掃描值的物件提供了程式介面。
NSScanner物件把NSString 物件的的字元解釋和轉化成 number和string 型別的值。在建立NSScanner物件的時候為它分配字元(string ),當你從NSScanner物件獲取內容的時候,它會從頭到尾遍歷字串(string)。
由於類簇的屬性, scanner物件並不是 NSScanner類的例項,而是它一個私有子類的例項。儘管scanner物件的類是私有的,但是它的介面是公開的(抽象父類已經宣告)。 NSScanner 的原始方法是string和
在 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++中,我們使用類對資料進行了隱藏和封裝,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式