首先說下正則表達式的定義:
正則表達式是對字符串操作的一種邏輯公式柱嫌,正則表達式可以檢測給定的字符串是否符合我們定義的邏輯胃珍,也可以從字符串中獲取我們想要的特定部分,他可以迅速地用極簡單的方式達到字符串的復雜控制或者說在編寫處理字符串的程序時傅蹂,經(jīng)常會有查找符合某些復雜規(guī)則的字符串的需要励稳,正則表達式就是用于描述這些規(guī)則的工具,換句話說犬金,正則表達式就是記錄文本規(guī)則的代碼
那么正則表達式能做什么呢?1.給定的字符串是否符合正則表達式的過濾邏輯(表單驗證);2.從字符串中獲取我們的想要部分(對字符串進行處理)
再簡單介紹下正則的寫法:正則表達式念恍,由一些普通字符和一些元字符組成,普通字符包括大小寫字母和數(shù)字晚顷,而元字符則具有特殊的含義.那么特殊符號都有哪些呢?我們又具體怎么使用它們呢?
'^'和'$'他們的作用是分別指出一個字符的開始和結(jié)束.
舉個例子:^one:表示所有以one開始的字符串("one cat,one123")峰伙,類似于OC中的hasPrefix方法;a dog$ 以 a dog 結(jié)尾;^apple$,那么這樣的話只能是apple.
' * ' ' + ' ' 该默?'這三個符號表示一個或N個字符重復出現(xiàn)的次數(shù)
ab*表示一個字符串有一個a后面跟著零個或若干個b
ab+表示一個字符串有一個a后面跟著至少一個b或更多個b
ab瞳氓?表示一個字符串有一個a后面跟著零個或一個b
a?b+$表示在字符串的末尾有零個或一個a跟著一個或幾個b
{}表示一個重復的具體范圍
ab{4}表示一個字符串一個a跟著4個b
ab{1,}表示一個字符串有一個a跟著至少一個b
ab{3,4}表示一個字符串有一個a跟著3到4個b
那么*用{0,}表示 +用{1栓袖,}表示 ?用{0匣摘,1}
注意:可以沒有上限,但不能沒有下限
|表示或操作
a|b表示一個字符串里有a或者b
(a|b)*c表示一串a(chǎn)裹刮,b混合的字符串后面跟一個c
[]表示在括號內(nèi)的眾多字符中音榜,選擇1個括號內(nèi)的符合語法的字符作為結(jié)果
[a-d]表示a到d中的一個
.代表除了\r\n ....之外的任何單個字符
a.[a-z]表示一個字符串有一個a后面跟著一個任意字符
^.{5}$表示任意1個長度為五的字符串
在[]里面用^表示不希望出現(xiàn)的字符,
@[^a-zA-Z]4@表示兩個@中不應該出現(xiàn)的字母
\d匹配一個數(shù)字字符捧弃,等價于[0-9]
\D匹配一個非數(shù)字字符赠叼,等價于[^0-9]
\w匹配包括下劃線的任何單詞字符,等價于[A-Za-z0-9_]
\W匹配任何非單詞字符 等價于[^A-Za-z0-9]
\轉(zhuǎn)義
接下來說下在項目里常用的正則表達式
驗證身份證號 ^\\d{17}[0-9xX]$
只能輸入數(shù)字和字母組成的字符串 ^[a-zA-Z0-9]+$
整數(shù)或小數(shù) ^[0-9]+([.][0-9]+){0,1}$
只能是數(shù)字 ^[0-9]*$
只能輸入n位數(shù)字 ^\\d{n}$
只能輸入m~n位數(shù)字 ^\\d{m,n}$
只能輸入非0的正整數(shù) ^\\+?[1-9][0-9]*$
只能輸入非0的負整數(shù) ^\\-[1-9][0-9]*$
只能輸入字母組成的字符串 ^[a-zA-Z]+$
判讀是否輸入了含有^%&',;=?$\\的特殊字符 .*[%&',;=?$\\^]+.*
只能輸入漢字 ^[\u4e00-\u9fa5]{0,}$
驗證URL ^https?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$
驗證一年12個月 ^(0?[1-9]|1[0-2])$
然后我們說下怎么用正則表達式去進行匹配進而去進行判斷
//NSRegularExpression正則表達式類
// NSTextCheckingResult文本檢查結(jié)果類
//要匹配的字符串
NSString *str = @"130120199411060039";
//正則語句
NSString *emailRegex = @"\\d{17}[0-9xX]";
//謂詞NSPredicate 作用:1.驗證正則表達式是否正確2.過濾數(shù)據(jù)和sql的where指定條件類似
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
//判斷
BOOL i = [emailTest evaluateWithObject:str];
if (i) {
NSLog(@"正確");
}else{
NSLog(@"錯誤");
}
NSArray *array = @[@"jim",@"cook",@"jobs",@"sdeven"];
//創(chuàng)建謂詞對象,設(shè)置過濾條件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"length>3"];
//對數(shù)組進行過濾得到一個新的數(shù)組
NSArray *arr = [array filteredArrayUsingPredicate:pre];
NSLog(@"%@",arr);
NSArray *array1 = @[@"2",@"3",@"4",@"5"];
NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"integerValue>=%@",@3];
NSLog(@"%@",[array1 filteredArrayUsingPredicate:pre1]);
NSArray *arr2=@[@1,@6,@3];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,3}"];
NSArray *arr3=[arr2 filteredArrayUsingPredicate:pre2];
NSLog(@"%@",arr3);
//在謂詞里面使用BETWEEN在什么之間,如果不想用任何實例方法嘴办,想篩選成員本身應該怎么做呢霜第,這時候就用self來代替; CONTAINS包含
//返回結(jié)果的類NSTextCheckingResult
//待檢測的字符串
NSString *searchText = @"12345";
//定義錯誤
NSError *error = NULL ;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
//返回第一個匹配結(jié)果
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
//若匹配成功
if (result) {
//輸出匹配結(jié)果
NSLog(@"%@",[searchText substringWithRange:result.range]);
}
就現(xiàn)在來說,在我們的APP中,用到的最多的應該也是對手機號進行判斷了,輸入手機號收驗證碼或者將手機號最為賬號都是很普遍的情況,我們來看下怎么對三大運營商的手機號進行判斷.
//驗證手機號
+ (BOOL)isValidateMobile:(NSString *)mobileNum{
/**
* 手機號碼
* 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 聯(lián)通:130,131,132,152,155,156,185,186
* 電信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
10 * 中國移動:China Mobile
11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,184,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[2478])\\d)\\d{7}$";
/**
15 * 中國聯(lián)通:China Unicom
16 * 130,131,132,152,155,156,185,186
17 */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
20 * 中國電信:China Telecom
21 * 133,1349,153,180,189
22 */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
25 * 大陸地區(qū)固話及小靈通
26 * 區(qū)號:010,020,021,022,023,024,025,027,028,029
27 * 號碼:七位或八位
28 */// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES)){
return YES;
}
else
{
return NO;
}
}