1、簡介:
在項目中,正則的使用是很普遍的,例如登錄賬號和密碼(手機號、郵箱等)。用到的方法就是謂詞對象過濾:NSPredicate。
2、什么是正則表達式:
正則表達式,又稱正規表示法,是對字符串操作的一種邏輯公式。正則表達式可以檢測給定的字符串是否符合我們定義的邏輯,也可以從字符串中獲取我們想要的特定部分。它可以迅速地用極簡單的方式達到字符串的復雜控制。
3、語法:
首先,特殊符號'^'和'$'。他們的作用是分別指出一個字符串的開始和結束。eg: “^one”:表示所有以”one”開始的字符串(”one cat”,”one123″,·····); 類似於:- (BOOL)hasPrefix:(NSString *)aString; “a dog$”:表示所以以”a dog”結尾的字符串(”it is a dog”,·····); 類似於:- (BOOL)hasSuffix:(NSString *)aString; “^apple$”:表示開始和結尾都是”apple”的字符串,這個是唯一的~; “banana”:表示任何包含”banana”的字符串。 類似於 iOS8的新方法- (BOOL)containsString:(NSString *)aString,搜索子串用的。 ‘*','+'和'?'這三個符號,表示一個或N個字符重復出現的次數。它們分別表示“沒有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“沒有或一次”([0,1]取整)。下面是幾個例子:
“ab*”:表示一個字符串有一個a后面跟着零個或若干個b(”a”, “ab”, “abbb”,……); “ab+”:表示一個字符串有一個a后面跟着至少一個b或者更多( ”ab”, “abbb”,……); “ab?”:表示一個字符串有一個a后面跟着零個或者一個b( ”a”, “ab”); “a?b+$”:表示在字符串的末尾有零個或一個a跟着一個或幾個b( ”b”, “ab”,”bb”,”abb”,……)。 可以用大括號括起來({}),表示一個重復的具體范圍。例如 “ab{4}”:表示一個字符串有一個a跟着4個b(”abbbb”); “ab{1,}”:表示一個字符串有一個a跟着至少1個b(”ab”,”abb”,”abbb”,……); “ab{3,4}”:表示一個字符串有一個a跟着3到4個b(”abbb”,”abbbb”)。 那么,“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示 注意:可以沒有下限,但是不能沒有上限!例如“ab{,5}”是錯誤的寫法 “ | ”表示“或”操作: “a|b”:表示一個字符串里有”a”或者”b”; “(a|bcd)ef”:表示”aef”或”bcdef”; “(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一個”c”;
方括號”[ ]“表示在括號內的眾多字符中,選擇1-N個括號內的符合語法的字符作為結果,例如 “[ab]“:表示一個字符串有一個”a”或”b”(相當於”a|b”); “[a-d]“:表示一個字符串包含小寫的'a'到'd'中的一個(相當於”a|b|c|d”或者”[abcd]“); “^[a-zA-Z]“:表示一個以字母開頭的字符串; “[0-9]a”:表示a前有一位的數字; “[a-zA-Z0-9]$”:表示一個字符串以一個字母或數字結束。 “.”匹配除“\r\n”之外的任何單個字符: “a.[a-z]“:表示一個字符串有一個”a”后面跟着一個任意字符和一個小寫字母; “^.{5}$”:表示任意1個長度為5的字符串; “\num” 其中num是一個正整數。表示”\num”之前的字符出現相同的個數,例如 “(.)\1″:表示兩個連續的相同字符。 “10\{1,2\}” : 表示數字1后面跟着1或者2個0 (“10″,”100″)。 ” 0\{3,\} ” 表示數字為至少3個連續的0 (“000”,“0000”,······)。 在方括號里用'^'表示不希望出現的字符,'^'應在方括號里的第一位。 “@[^a-zA-Z]4@”表示兩個”@”中不應該出現字母)。 常用的還有: “ \d ”匹配一個數字字符。等價於[0-9]。 “ \D”匹配一個非數字字符。等價於[^0-9]。 “ \w ”匹配包括下划線的任何單詞字符。等價於“[A-Za-z0-9_]”。 “ \W ”匹配任何非單詞字符。等價於“[^A-Za-z0-9_]”。 iOS中書寫正則表達式,碰到轉義字符,多加一個“\”,例如: 全數字字符:@”^\\d\+$”
4、常用的正則表達式如下:(郵箱,電話號碼,身份證,密碼,昵稱)
//郵箱 + (BOOL) validateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:email]; } //手機號碼驗證 + (BOOL) validateMobile:(NSString *)mobile { //手機號以13, 15,18開頭,八個 \d 數字字符 NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$"; NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex]; return [phoneTest evaluateWithObject:mobile]; } //車牌號驗證 + (BOOL) validateCarNo:(NSString *)carNo { NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex]; NSLog(@"carTest is %@",carTest); return [carTest evaluateWithObject:carNo]; } //車型 + (BOOL) validateCarType:(NSString *)CarType { NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex]; return [carTest evaluateWithObject:CarType]; } //用戶名 + (BOOL) validateUserName:(NSString *)name { NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$"; NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex]; BOOL B = [userNamePredicate evaluateWithObject:name]; return B; } //密碼 + (BOOL) validatePassword:(NSString *)passWord { NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; return [passWordPredicate evaluateWithObject:passWord]; } //昵稱 + (BOOL) validateNickname:(NSString *)nickname { NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; return [passWordPredicate evaluateWithObject:nickname]; } //身份證號 + (BOOL) validateIdentityCard: (NSString *)identityCard { BOOL flag; if (identityCard.length <= 0) { flag = NO; return flag; } NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$"; NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2]; return [identityCardPredicate evaluateWithObject:identityCard]; }
4、本人整理了一個正則表達式的類,供大家使用,列舉了常用的正則表達式,當然自己也可以擴充(自定義吧)
github: https://github.com/xiayuanquan/XYQRegexPattern
支持CocoaPods: pod 'XYQRegexPattern', '~> 2.0.0'