正则表达式
正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",
这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.
在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,
比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,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: NSObject 12 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! 欢迎留言交流,一起学习...