NSString *phoneNum = @"abcd"; NSString *regx = @"^1[358][0-9]{9}$"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regx]; BOOL invalue = [pre evaluateWithObject:phoneNum]; NSLog(@"%@",invalue?@"YES":@"NO");
這是一個用來驗證手機號格式是否正確的一段代碼,html
簡單介紹NSPredicate,這種語句就像sql語句同樣,指定了數據被過濾或者獲取的方式。瞭解sql語句的孩子會以爲很簡單。ios
上面那段代碼剛開始看可能有點不理解,沒事,按部就班,看完這篇文章就懂了正則表達式
所謂數據過濾或者獲取,就是從一段數據中,好比"哈哈哈哈哈1234567898423哈哈哈哈哈哈"中找到那段數字。sql
(一)首先了解語句的構成 數據庫
想要查找數據的時候,好比在某張公司員工的表格中查找叫「曹國芳」的人的年齡,是這樣表示的 「select age(表裏的元素) from infoTable(表名) where name = '曹國芳'」 翻譯成中文大約是,查出來年齡 從那張信息表裏 在名字=曹國芳的那條,這樣翻譯可能有些直白,可是可讓沒接觸過sql語句的人能聽懂我在說什麼。 而謂詞呢,更爲簡潔,由於沒有涉及到數據庫以及表格,因此在用起來也是幾行代碼就能辦到。數組
因此在使用NSPredicate的時候,也有不少判斷條件lua
1,比較運算符spa
(1)=、==:判斷兩個表達式是否相等,在謂詞中=和==是相同的意思都是判斷,而沒有賦值這一說咱們能夠看到輸出的內容爲翻譯
(2)>=,=>:判斷左邊表達式的值是否大於或等於右邊表達式的值code
(3)<=,=<:判斷右邊表達式的值是否小於或等於右邊表達式的值
(4)>:判斷左邊表達式的值是否大於右邊表達式的值
(5)<:判斷左邊表達式的值是否小於右邊表達式的值
(6)!=、<>:判斷兩個表達式是否不相等
(7)BETWEEN:BETWEEN表達式必須知足表達式 BETWEEN {下限,上限}的格式,要求該表達式必須大於或等於下限,並小於或等於上限
比較運算符使用起來是這樣的
NSString *phoneNum = @"123"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF = 123"]; BOOL invalue = [pre evaluateWithObject:phoneNum]; NSLog(@"%@",invalue?@"YES":@"NO");
就算是BETWEEN 用起來就能夠這麼改 'SELF BETWEEN {10,20}' 判斷是否這個數字在10-20之間
2.邏輯運算符
(1)AND、&&:邏輯與,要求兩個表達式的值都爲YES時,結果才爲YES。
輸出結果爲:
(2)OR、||:邏輯或,要求其中一個表達式爲YES時,結果就是YES
(3)NOT、 !:邏輯非,對原有的表達式取反
3.字符串比較運算符
(1)BEGINSWITH:檢查某個字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')
(2)ENDSWITH:檢查某個字符串是否以指定的字符串結尾
(3)CONTAINS:檢查某個字符串是否包含指定的字符串
(4)LIKE:檢查某個字符串是否匹配指定的字符串模板。其以後能夠跟?表明一個字符和*表明任意多個字符兩個通配符。好比"name LIKE '*ac*'",這表示name的值中包含ac則返回YES;"name LIKE '?ac*'",表示name的第二、3個字符爲ac時返回YES。
(5)MATCHES:檢查某個字符串是否匹配指定的正則表達式。雖然正則表達式的執行效率是最低的,但其功能是最強大的,也是咱們最經常使用的。這也就是我在文章剛開頭那麼用的
注:字符串比較都是區分大小寫和重音符號的。如:café和cafe是不同的,Cafe和cafe也是不同的。若是但願字符串比較運算不區分大小寫和重音符號,請在這些運算符後使用[c],[d]選項。其中[c]是不區分大小寫,[d]是不區分重音符號,其寫在字符串比較運算符以後,好比:name LIKE[cd] 'cafe',那麼不論name是cafe、Cafe仍是café上面的表達式都會返回YES
4.集合運算符
(1)ANY、SOME:集合中任意一個元素知足條件,就返回YES。
(2)ALL:集合中全部元素都知足條件,才返回YES。
(3)NONE:集合中沒有任何元素知足條件就返回YES。如:NONE person.age < 18,表示person集合中全部元素的age>=18時,才返回YES。
(4)IN:等價於SQL語句中的IN運算符,只有當左邊表達式或值出如今右邊的集合中才會返回YES。咱們經過一個例子來看一下
(5)array[index]:返回array數組中index索引處的元素
(6)array[FIRST]:返回array數組中第一個元素
(7)array[LAST]:返回array數組中最後一個元素
(8)array[SIZE]:返回array數組中元素的個數
5.直接量
在謂詞表達式中可使用以下直接量
(1)FALSE、NO:表明邏輯假
(2)TRUE、YES:表明邏輯真
(3)NULL、NIL:表明空值
(4)SELF:表明正在被判斷的對象自身
(5)"string"或'string':表明字符串
(6)數組:和c中的寫法相同,如:{'one', 'two', 'three'}。
(7)數值:包括證書、小數和科學計數法表示的形式
(8)十六進制數:0x開頭的數字
(9)八進制:0o開頭的數字
(10)二進制:0b開頭的數字
6.保留字
下列單詞都是保留字(不論大小寫)
AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE
注:雖然大小寫均可以,可是更推薦使用大寫來表示這些保留字
(二)NSPredicate 使用方法
1.正則表達式 當使用NSRegularExpression使用正則表達式時,若是驗證手機號,用它「1[358][0-9]{9}」就能夠了,可是若是用NSPredicate來使用正則表達式,有點瑕疵,須要按照"^正則表達式$"來使用纔不會出現有可能判斷失誤的問題
2.使用謂詞過濾集合 (劃重點)
當程序使用謂詞對集合元素進行過濾時,程序會自動遍歷其元素,並根據集合元素來計算謂詞的值,當這個集合中的元素計算謂詞並返回YES時,這個元素纔會被保留下來。請注意程序會自動遍歷其元素,它會將自動遍歷過以後返回爲YES的值從新組合成一個集合返回。
(1)NSArray提供了以下方法使用謂詞來過濾集合
- (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSArray集合,返回符合條件的元素組成的新集合
(2)NSMutableArray提供了以下方法使用謂詞來過濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSMutableArray,剔除集合中不符合條件的元素
(3)NSSet提供了以下方法使用謂詞來過濾集合
- (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):做用同NSArray中的方法
(4)NSMutableSet提供了以下方法使用謂詞來過濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):做用同NSMutableArray中的方法。
經過上面的描述能夠看出,使用謂詞過濾不可變集合和可變集合的區別是:過濾不可變集合時,會返回符合條件的集合元素組成的新集合;過濾可變集合時,沒有返回值,會直接剔除不符合條件的集合元素
具體實例請參考原創做者的http://www.cocoachina.com/ios/20160111/14926.html