在上一篇中,我們聊了NSPredicate的基本用法:謂詞的基本語法、謂詞的定義和使用。在本篇中,我們聊聊NSPredicate和正則表達式的結合使用來進行表單內容的篩選。
我們常常遇到這種需求:要求用戶輸入的用戶名必須是字母、密碼必須是數字、判斷用戶輸入的手機號是否合法等等。這些需求我們就可以使用NSPredicate和正則表達式來配合篩選了。
首先我們來說說正則表達式。正則表達式的語法非常複雜,對於一般的驗證條件,我們可以在網上找到現成的表達式,拿來就能用,我展示一些常用的正則出來:
-
1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,並且第一個字必須爲字母6~16位;
-
2.驗證電話號碼:("^(\\d{3,4}-)\\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
-
3.驗證手機號碼:"^1[3|4|5|7|8][0-9]\\d{8}$";
-
4.驗證身份證號(15位或18位數字):"\\d{14}[[0-9],0-9xX]";
-
5.驗證Email地址:("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$");
-
6.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$") ;
-
7.整數或者小數:^[0-9]+([.]{0,1}[0-9]+){0,1}$
-
8.只能輸入數字:"^[0-9]*$"。
-
9.只能輸入n位的數字:"^\\d{n}$"。
-
10.只能輸入至少n位的數字:"^\\d{n,}$"。
-
11.只能輸入m~n位的數字:"^\\d{m,n}$"。
-
12.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。
-
13.只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
-
14.只能輸入有1~3位小數的正實數:"^[0-9]+(\.[0-9]{1,3})?$"。
-
15.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
-
16.只能輸入非零的負整數:"^\-[1-9][]0-9"*$。
-
17.只能輸入長度爲3的字符:"^.{3}$"。
-
18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。
-
19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
-
20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
-
21.驗證是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
-
22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。
-
23.驗證URL:"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"。
-
24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式爲:"01"~"09"和"10"~"12"。
-
25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式爲;"01"~"09"、"10"~"29"和“30”~“31”。
-
26.獲取日期正則表達式:\\d{4}[年|\-|\.]\\d{\1-\12}[月|\-|\.]\\d{\1-\31}日?
-
評註:可用來匹配大多數年月日信息。
-
27.匹配雙字節字符(包括漢字在內):[^\x00-\xff]
-
評註:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
-
28.匹配空白行的正則表達式:\n\s*\r
-
評註:可以用來刪除空白行
-
29.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? />
-
評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力
-
30.匹配首尾空白字符的正則表達式:^\s*|\s*$
-
評註:可以用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),非常有用的表達式
-
31.匹配網址URL的正則表達式:[a-zA-z]+:
-
評註:網上流傳的版本功能很有限,上面這個基本可以滿足需求
-
32.匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
-
評註:表單驗證時很實用
-
33.匹配騰訊QQ號:[1-9][0-9]\{4,\}
-
評註:騰訊QQ號從10 000 開始
-
34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d)
-
評註:中國郵政編碼爲6位數字
-
35.匹配ip地址:((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)。
-
評註:提取ip地址時有用
如果驗證條件更加複雜或者找不到想要的正則式,則可以參考這個地方,自己動手寫一個出來:點擊打開鏈接 。不過在使用之前,切記要先用工具測試一下。
上邊說的是正則表達式,下邊就說謂詞如何與正則表達式聯用。
在上一篇中我們介紹了謂詞的語法,當謂詞和正則聯用時,我們就需要認識兩個新的關鍵字:SELF、MATCHES。
self的意思是指代要驗證的字符串本身,matches是一個字符串操作:表示匹配。我們用self+matches+正則表達式就可以拼接出一個謂詞了。如:
-
-
NSString *string = @"wo";
-
-
NSString *regex = @"^[A-Za-z]*$";
-
-
NSPredicate *predicateRe1 = [NSPredicate predicateWithFormat:@"self matches %@", regex];
-
-
BOOL resualt = [predicateRe1 evaluateWithObject:string];
-
NSLog(@"匹配結果%d", resualt);
打印的結果是:
-
2015-06-17 11:58:23.129 NSPredicate[3183:277528] 匹配結果1
表示字符串符合正則式的要求。
系統還給我們提供了一個類,共我們使用正則表達式:NSRegularExpression。這個類非常簡單,不做過多描述,大家看下邊的例子,進入方法的頭文件中可以瞭解更多用法。
-
-
-
-
-
-
-
-
NSError *error;
-
-
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex
-
options:NSRegularExpressionCaseInsensitive
-
error:&error];
-
-
-
if (!error) {
-
NSRange range = NSMakeRange(0, string.length);
-
-
-
NSTextCheckingResult *match = [regularExpression firstMatchInString:string
-
options:NSMatchingReportProgress
-
range:range];
-
if (match) {
-
NSLog(@"NSRegularExpression匹配成功");
-
}
-
-
} else {
-
NSLog(@"錯誤類型:%@",error);
-
}
-
打印的結果是:
-
2015-06-17 11:58:23.129 NSPredicate[3183:277528] NSRegularExpression匹配成功