你的位置:首页 > 操作系统

[操作系统]iOS 中的正则匹配(工具类)


正则表达式

正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",

这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.

在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,

比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,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 @interface RegularTool: NSObject12 13 /*!14  * 匹配固定电话号码15  *16  * @param number 需要匹配的固话号码17  *18  * @return 返回匹配结果19 */20 + (BOOL)matchTelephoneNumber:(NSString *)number;21 22 /*!23  * 匹配手机号码24  *25  * @param number 需要匹配的手机号码26  *27  * @return 返回匹配结果28 */29 + (BOOL)matchMobilephoneNumber:(NSString *)number;30 31 /*!32  * 匹配3-15位的中文或英文(用户名)33  *34  * @param username 需要匹配的字符串35  *36  * @return 返回匹配结果37 */38 + (BOOL)matchUsername:(NSString *)username;39 40 /*!41  * 匹配6-18位的数字和字母组合(密码)42  *43  * @param password 需要匹配的字符串44  *45  * @return 返回匹配结果46 */47 + (BOOL)matchPassword:(NSString *)password;48 49 /*!50  * 匹配邮箱帐号51  *52  * @param email 需要匹配的邮箱帐号53  *54  * @return 返回匹配结果55 */56 + (BOOL)matchEmail:(NSString *)email;57 58 /*!59  * 匹配身份证号码60  *61  * @param idCard 需要匹配的身份证号码62  *63  * @return 返回匹配结果64 */65 + (BOOL)matchUserIdCard:(NSString *)idCard;66 67 /*!68  * 匹配URL字符串69  *70  * @param urlStr 需要匹配的URL字符串71  *72  * @return 返回匹配结果73 */74 + (BOOL)matchURLStr:(NSString *)urlStr;75 76 /*!77  * 匹配¥:价格字符串78  *79  * @param priceStr 包含价格的字符串80  *81  * @return 返回匹配结果82 */83 + (BOOL)matchPriceStr:(NSString *)priceStr;84 85 @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 + (BOOL)matchTelephoneNumber:(NSString *)number { 15   NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$"; 16   return [RegularTool matchString:number withPattern:pattern]; 17 } 18  19 #pragma mark - 匹配手机号码 20 + (BOOL)matchMobilephoneNumber:(NSString *)number { 21   NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$"; 22   return [RegularTool matchString:number withPattern:pattern]; 23 } 24  25 #pragma mark - 匹配3-15位的中文或英文(用户名) 26 + (BOOL)matchUsername:(NSString *)username { 27   NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$"; 28   return [RegularTool matchString:username withPattern:pattern]; 29 } 30  31 #pragma mark - 匹配6-18位的数字和字母组合(密码) 32 + (BOOL)matchPassword:(NSString *)password { 33   NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$"; 34   return [RegularTool matchString: password withPattern: pattern]; 35 } 36  37 #pragma mark - 匹配邮箱帐号 38 + (BOOL)matchEmail:(NSString *)email { 39   NSString *pattern = 40   @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$"; 41   return [RegularTool matchString:email withPattern:pattern]; 42 } 43  44 #pragma mark - 匹配身份证号码 45 + (BOOL)matchUserIdCard:(NSString *)idCard { 46   NSString *pattern = 47   @"(^[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])$)"; 48   return [RegularTool matchString:idCard withPattern:pattern]; 49 } 50  51 #pragma mark - 匹配URL字符串 52 + (BOOL)matchURLStr:(NSString *)urlStr { 53   NSString *pattern = @"^[0-9A-Za-z]{1,50}$"; 54   return [RegularTool matchString:urlStr withPattern: pattern]; 55 } 56  57 #pragma mark - 匹配¥:价格字符串 58 + (BOOL)matchPriceStr:(NSString *)priceStr { 59   NSError *error = nil; 60   NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:@"¥(\\d+(?:\\.\\d+)?)" options: 1 << 0 error: &error]; 61   if (!error) { 62     NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)]; 63     if (result) { 64       for (NSTextCheckingResult *checkingRes in result) { 65         if (checkingRes.range.location == NSNotFound) { 66           continue; 67         } 68         NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]); 69         //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]); 70       } 71     } 72     return YES; 73   } 74   NSLog(@"匹配失败,Error: %@",error); 75   return NO; 76 } 77  78  79 /*! 80  * 正则匹配 81  * 82  * @param str   匹配的字符串 83  * @param pattern 匹配规则 84  * 85  * @return 返回匹配结果 86 */ 87 + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern { 88   NSError *error = nil; 89   NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error]; 90   if (!error) { 91     NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)]; 92     if (result) { 93       NSLog(@"匹配成功,Result: %@",[str substringWithRange:result.range]); 94       return YES; 95     } 96   } 97   NSLog(@"匹配失败,Error: %@",error); 98   return NO; 99 }100 101 @end

end! 欢迎留言交流,一起学习...