iOS開發,謂詞(NSPredicate)的用法:(二)謂詞和正則表達式配合使用,進行表單內容判斷

在上一篇中,我們聊了NSPredicate的基本用法:謂詞的基本語法、謂詞的定義和使用。在本篇中,我們聊聊NSPredicate和正則表達式的結合使用來進行表單內容的篩選。

我們常常遇到這種需求:要求用戶輸入的用戶名必須是字母、密碼必須是數字、判斷用戶輸入的手機號是否合法等等。這些需求我們就可以使用NSPredicate和正則表達式來配合篩選了。

首先我們來說說正則表達式。正則表達式的語法非常複雜,對於一般的驗證條件,我們可以在網上找到現成的表達式,拿來就能用,我展示一些常用的正則出來:

[objc] view plaincopy
  1. 1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,並且第一個字必須爲字母6~16位;  
  2. 2.驗證電話號碼:("^(\\d{3,4}-)\\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx;  
  3. 3.驗證手機號碼:"^1[3|4|5|7|8][0-9]\\d{8}$";  
  4. 4.驗證身份證號(15位或18位數字):"\\d{14}[[0-9],0-9xX]";  
  5. 5.驗證Email地址:("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$");  
  6. 6.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$") ;  
  7. 7.整數或者小數:^[0-9]+([.]{0,1}[0-9]+){0,1}$  
  8. 8.只能輸入數字:"^[0-9]*$"。  
  9. 9.只能輸入n位的數字:"^\\d{n}$"。  
  10. 10.只能輸入至少n位的數字:"^\\d{n,}$"。  
  11. 11.只能輸入m~n位的數字:"^\\d{m,n}$"。  
  12. 12.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。  
  13. 13.只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。  
  14. 14.只能輸入有1~3位小數的正實數:"^[0-9]+(\.[0-9]{1,3})?$"。  
  15. 15.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。  
  16. 16.只能輸入非零的負整數:"^\-[1-9][]0-9"*$。  
  17. 17.只能輸入長度爲3的字符:"^.{3}$"。  
  18. 18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。  
  19. 19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。  
  20. 20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。  
  21. 21.驗證是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。  
  22. 22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。  
  23. 23.驗證URL:"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"。  
  24. 24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式爲:"01""09""10""12"。  
  25. 25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式爲;"01""09""10""29"和“30”~“31”。  
  26. 26.獲取日期正則表達式:\\d{4}[年|\-|\.]\\d{\1-\12}[月|\-|\.]\\d{\1-\31}日?  
  27. 評註:可用來匹配大多數年月日信息。  
  28. 27.匹配雙字節字符(包括漢字在內):[^\x00-\xff]  
  29. 評註:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)  
  30. 28.匹配空白行的正則表達式:\n\s*\r  
  31. 評註:可以用來刪除空白行  
  32. 29.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? />  
  33. 評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力  
  34. 30.匹配首尾空白字符的正則表達式:^\s*|\s*$  
  35. 評註:可以用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),非常有用的表達式  
  36. 31.匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*  
  37. 評註:網上流傳的版本功能很有限,上面這個基本可以滿足需求  
  38. 32.匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$  
  39. 評註:表單驗證時很實用  
  40. 33.匹配騰訊QQ號:[1-9][0-9]\{4,\}  
  41. 評註:騰訊QQ號從10 000 開始  
  42. 34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d)  
  43. 評註:中國郵政編碼爲6位數字  
  44. 35.匹配ip地址:((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)。  
  45. 評註:提取ip地址時有用  

如果驗證條件更加複雜或者找不到想要的正則式,則可以參考這個地方,自己動手寫一個出來:點擊打開鏈接 。不過在使用之前,切記要先用工具測試一下。

上邊說的是正則表達式,下邊就說謂詞如何與正則表達式聯用。

在上一篇中我們介紹了謂詞的語法,當謂詞和正則聯用時,我們就需要認識兩個新的關鍵字:SELF、MATCHES。

self的意思是指代要驗證的字符串本身,matches是一個字符串操作:表示匹配。我們用self+matches+正則表達式就可以拼接出一個謂詞了。如:

[objc] view plaincopy
  1. // 判斷字符串首字符是否爲字母  
  2.         NSString *string = @"wo";  
  3.         // 1、準備正則式  
  4.         NSString *regex = @"^[A-Za-z]*$"// 只能是字母,不區分大小寫  
  5.         // 2、拼接謂詞  
  6.         NSPredicate *predicateRe1 = [NSPredicate predicateWithFormat:@"self matches %@", regex];  
  7.         // 3、匹配字符串  
  8.         BOOL resualt = [predicateRe1 evaluateWithObject:string];  
  9.         NSLog(@"匹配結果%d", resualt);  

打印的結果是:

[objc] view plaincopy
  1. 2015-06-17 11:58:23.129 NSPredicate[3183:277528] 匹配結果1  

表示字符串符合正則式的要求。

系統還給我們提供了一個類,共我們使用正則表達式:NSRegularExpression。這個類非常簡單,不做過多描述,大家看下邊的例子,進入方法的頭文件中可以瞭解更多用法。

[objc] view plaincopy
  1. /**NSRegularExpression類和正則表達式聯用 
  2.         * 
  3.         * 
  4.         * 
  5.         **/  
  6.        // 1、創建NSRegularExpression對象並指定正則表達式  
  7.        // 由於NSRegularExpression需要一個nserror對象,所以要先創建出來  
  8.        NSError *error;  
  9.        // 第一個參數是正則表達式,第二個參數是匹配操作的類型(枚舉值),第三個是error的地址  
  10.        NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex  
  11.                                                                                           options:NSRegularExpressionCaseInsensitive  
  12.                                                                                             error:&error];  
  13.          
  14.        // 如果沒有錯誤,則進行正則匹配  
  15.        if (!error) {  
  16.            NSRange range = NSMakeRange(0, string.length);  
  17.            // 第一個參數是要匹配的字符串,第二個參數是匹配操作的類型,第三個是要匹配字符串的範圍  
  18.            // 建議進入頭文件查看其他方法  
  19.            NSTextCheckingResult *match = [regularExpression firstMatchInString:string  
  20.                                                                        options:NSMatchingReportProgress  
  21.                                                                          range:range];  
  22.            if (match) {  
  23.                NSLog(@"NSRegularExpression匹配成功");  
  24.            }  
  25.        // 如果發生錯誤,打印錯誤類型  
  26.        } else {  
  27.            NSLog(@"錯誤類型:%@",error);  
  28.        }  
  29.          

打印的結果是:

[objc] view plaincopy
  1. 2015-06-17 11:58:23.129 NSPredicate[3183:277528] NSRegularExpression匹配成功 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章