正則表達式正則表達式是對字元串操作的一種邏輯公式, 用事先定義好的一些特定字元、及這些特定字元的組合, 組成一個"規則字元串",這個"規則字元串"用來表達對字元串的一種過濾邏輯,正則表達式就是用於描述這些規則的工具,或者說, 正則表達式就是記錄文本規則的代碼.在開發中, 我們經常會有查找符合某些複雜...
正則表達式
正則表達式是對字元串操作的一種邏輯公式, 用事先定義好的一些特定字元、及這些特定字元的組合, 組成一個"規則字元串",
這個"規則字元串"用來表達對字元串的一種過濾邏輯, 正則表達式就是用於描述這些規則的工具, 或者說, 正則表達式就是記錄文本規則的代碼.
在開發中, 我們經常會有查找符合某些複雜規則的字元串的需要,
比如數據校驗: 判斷用戶的輸入是否合法(如:用戶註冊的時候,QQ號碼,電話號碼,郵箱是否符合要求)
下麵讓我們先來看看正則匹配常用的一些字元:
一. 常用通配符
. 匹配除換行符以外的任意字元
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符(空格,tab\t,回車\r \n)
\d 匹配數字
^ 匹配字元串的開始
$ 匹配字元串的結束
\b 匹配單詞的開始或結束
二. 常用反義通配符
\W 匹配任意不是字母,數字,下劃線,漢字的字元
\S 匹配任意不是空白符的字元
\D 匹配任意非數字的字元
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字元
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字元
三. 集合
[xyz] 匹配xyz中任意的字元
[^xyz] 匹配不是xyz中的任意字元
[a-z] 匹配從小寫字母a到小寫字母z之間的任意字元
[^a-z] 匹配非從小寫字母a到小寫字母z之間的任意字元
四. 常用限定符
* 重覆零次或更多次
+ 重覆一次或更多次
? 重覆零次或一次
{n} 重覆n次
{n,} 重覆n次或更多次
{n,m} 重覆n到m次
五. 貪婪和懶惰模式(預設是貪婪模式;在量詞後面直接加上問號,就是非貪婪模式)
*? 重覆任意次,但儘可能少重覆
+? 重覆一次或更多次,但儘可能少重覆
?? 重覆零次或一次,但儘可能少重覆
{n,m}? 重覆n到m次,但儘可能少重覆
{n,}? 重覆n次以上,但儘可能少重覆
以上就是正則表達式的匹配規則需要使用到的字元.
下麵是我在開發中時常用到的和平時收集的一些正則匹配,為了後續方便,所以整理下封裝成一個工具類,提供類方法來調用,返回匹配結果.
或許上面的匹配字元有些朋友看不太明白,那就不說廢話了,上代碼,多看幾次,然後自己嘗試著去寫,很快就可以明白了.
- RegularTool.h
1 // 2 // RegularTool.h 3 // 正則匹配 4 // 5 // Created by Arvin on 15/12/3. 6 // Copyright © 2015年 Arvin. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 typedef void(^resultBlock)(NSString *res); 12 13 @interface RegularTool: NSObject 14 15 /*! 16 * 匹配固定電話號碼 17 * 18 * @param number 需要匹配的固話號碼 19 * 20 * @return 返回匹配結果 21 */ 22 + (NSString *)matchTelephoneNumber:(NSString *)number; 23 24 /*! 25 * 匹配手機號碼 26 * 27 * @param number 需要匹配的手機號碼 28 * 29 * @return 返回匹配結果 30 */ 31 + (NSString *)matchMobilephoneNumber:(NSString *)number; 32 33 /*! 34 * 匹配3-15位的中文或英文(用戶名) 35 * 36 * @param username 需要匹配的字元串 37 * 38 * @return 返回匹配結果 39 */ 40 + (NSString *)matchUsername:(NSString *)username; 41 42 /*! 43 * 匹配6-18位的數字和字母組合(密碼) 44 * 45 * @param password 需要匹配的字元串 46 * 47 * @return 返回匹配結果 48 */ 49 + (NSString *)matchPassword:(NSString *)password; 50 51 /*! 52 * 匹配郵箱帳號 53 * 54 * @param email 需要匹配的郵箱帳號 55 * 56 * @return 返回匹配結果 57 */ 58 + (NSString *)matchEmail:(NSString *)email; 59 60 /*! 61 * 匹配身份證號碼 62 * 63 * @param idCard 需要匹配的身份證號碼 64 * 65 * @return 返回匹配結果 66 */ 67 + (NSString *)matchUserIdCard:(NSString *)idCard; 68 69 /*! 70 * 匹配URL字元串 71 * 72 * @param urlStr 需要匹配的URL字元串 73 * 74 * @return 返回匹配結果 75 */ 76 + (NSString *)matchURLStr:(NSString *)urlStr; 77 78 /*! 79 * 匹配¥:價格字元串 80 * 81 * @param priceStr 包含價格的字元串 82 * 83 * @return 返回匹配結果 84 */ 85 + (BOOL)matchPriceStr:(NSString *)priceStr; 86 87 @end
- RegularTool.m
1 // 2 // RegularTool.m 3 // 正則匹配 4 // 5 // Created by Arvin on 15/12/3. 6 // Copyright © 2015年 Arvin. All rights reserved. 7 // 8 9 #import "RegularTool.h" 10 11 @implementation RegularTool 12 13 #pragma mark - 匹配固定電話號碼 14 + (NSString *)matchTelephoneNumber:(NSString *)number { 15 NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$"; 16 __block NSString *result; 17 [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) { 18 result = res; 19 }]; 20 return result; 21 } 22 23 #pragma mark - 匹配手機號碼 24 + (NSString *)matchMobilephoneNumber:(NSString *)number { 25 NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$"; 26 __block NSString *result; 27 [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) { 28 result = res; 29 }]; 30 return result; 31 } 32 33 #pragma mark - 匹配3-15位的中文或英文(用戶名) 34 + (NSString *)matchUsername:(NSString *)username { 35 NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$"; 36 __block NSString *result; 37 [RegularTool matchString:username withPattern:pattern resultBlock:^(NSString *res) { 38 result = res; 39 }]; 40 return result; 41 } 42 43 #pragma mark - 匹配6-18位的數字和字母組合(密碼) 44 + (NSString *)matchPassword:(NSString *)password { 45 NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$"; 46 __block NSString *result; 47 [RegularTool matchString: password withPattern: pattern resultBlock:^(NSString *res) { 48 result = res; 49 }]; 50 return result; 51 } 52 53 #pragma mark - 匹配郵箱帳號 54 + (NSString *)matchEmail:(NSString *)email { 55 NSString *pattern = 56 @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$"; 57 __block NSString *result; 58 [RegularTool matchString:email withPattern:pattern resultBlock:^(NSString *res) { 59 result = res; 60 }]; 61 return result; 62 } 63 64 #pragma mark - 匹配身份證號碼 65 + (NSString *)matchUserIdCard:(NSString *)idCard { 66 NSString *pattern = 67 @"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)"; 68 __block NSString *result; 69 [RegularTool matchString:idCard withPattern:pattern resultBlock:^(NSString *res) { 70 result = res; 71 }]; 72 return result; 73 } 74 75 #pragma mark - 匹配URL字元串 76 + (NSString *)matchURLStr:(NSString *)urlStr { 77 NSString *pattern = @"^[0-9A-Za-z]{1,50}$"; 78 __block NSString *result; 79 [RegularTool matchString:urlStr withPattern: pattern resultBlock:^(NSString *res) { 80 result = res; 81 }]; 82 return result; 83 } 84 85 #pragma mark - 匹配¥:價格字元串 86 + (BOOL)matchPriceStr:(NSString *)priceStr { 87 NSError *error = nil; 88 NSString *pattern = @"¥(\\d+(?:\\.\\d+)?)"; 89 NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options: 1 << 0 error: &error]; 90 if (!error) { 91 NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)]; 92 if (result) { 93 for (NSTextCheckingResult *checkingRes in result) { 94 if (checkingRes.range.location == NSNotFound) { 95 continue; 96 } 97 NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]); 98 //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]); 99 } 100 } 101 return YES; 102 } 103 NSLog(@"匹配失敗,Error: %@",error); 104 return NO; 105 } 106 107 108 /*! 109 * 正則匹配 110 * 111 * @param str 匹配的字元串 112 * @param pattern 匹配規則 113 * 114 * @return 返回匹配結果 115 */ 116 + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern resultBlock:(resultBlock)block { 117 NSError *error = nil; 118 NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error]; 119 if (!error) { 120 NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)]; 121 if (result) { 122 NSLog(@"匹配成功"); 123 block([str substringWithRange:result.range]); 124 return YES; 125 } else { 126 NSLog(@"匹配失敗"); 127 return NO; 128 } 129 } 130 NSLog(@"匹配失敗,Error: %@",error); 131 return NO; 132 } 133 134 @end
END! 歡迎留言交流,一起學習...