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