我们常常遇到这种需求:要求用户输入的用户名必须是字母、密码必须是数字、判断用户输入的手机号是否合法等等。这些需求我们就可以使用NSPredicate和正则表达式来配合筛选了。
首先我们来说说正则表达式。正则表达式的语法非常复杂,对于一般的验证条件,我们可以在网上找到现成的表达式,拿来就能用,我展示一些常用的正则出来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
1
.验证用户名和密码:(
"^[a-zA-Z]\w{5,15}$"
)正确格式:
"[A-Z][a-z]_[0-9]"
组成,并且第一个字必须为字母
6
~
16
位;
2
.验证电话号码:(
"^(\\d{3,4}-)\\d{7,8}$"
)正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3
.验证手机号码:
"^1[3|4|5|7|8][0-9]\\d{8}$"
;
4
.验证身份证号(
15
位或
18
位数字):
"\\d{14}[[0-9],0-9xX]"
;
5
.验证Email地址:(
"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$"
);
6
.只能输入由数字和
26
个英文字母组成的字符串:(
"^[A-Za-z0-9]+$"
) ;
7
.整数或者小数:^[
0
-
9
]+([.]{
0
,
1
}[
0
-
9
]+){
0
,
1
}$
8
.只能输入数字:
"^[0-9]*$"
。
9
.只能输入n位的数字:
"^\\d{n}$"
。
10
.只能输入至少n位的数字:
"^\\d{n,}$"
。
11
.只能输入m~n位的数字:
"^\\d{m,n}$"
。
12
.只能输入零和非零开头的数字:
"^(0|[1-9][0-9]*)$"
。
13
.只能输入有两位小数的正实数:
"^[0-9]+(.[0-9]{2})?$"
。
14
.只能输入有
1
~
3
位小数的正实数:
"^[0-9]+(\.[0-9]{1,3})?$"
。
15
.只能输入非零的正整数:
"^\+?[1-9][0-9]*$"
。
16
.只能输入非零的负整数:
"^\-[1-9][]0-9"
*$。
17
.只能输入长度为
3
的字符:
"^.{3}$"
。
18
.只能输入由
26
个英文字母组成的字符串:
"^[A-Za-z]+$"
。
19
.只能输入由
26
个大写英文字母组成的字符串:
"^[A-Z]+$"
。
20
.只能输入由
26
个小写英文字母组成的字符串:
"^[a-z]+$"
。
21
.验证是否含有^%&
',;=?$\"等字符:"[^%&'
,;=?$\x22]+"。
22
.只能输入汉字:
"^[\u4e00-\u9fa5]{0,}$"
。
24
.验证一年的
12
个月:
"^(0?[1-9]|1[0-2])$"
正确格式为:
"01"
~
"09"
和
"10"
~
"12"
。
25
.验证一个月的
31
天:
"^((0?[1-9])|((1|2)[0-9])|30|31)$"
正确格式为;
"01"
~
"09"
、
"10"
~
"29"
和“
30
”~“
31
”。
26
.获取日期正则表达式:\\d{
4
}[年|\-|\.]\\d{\
1
-\
12
}[月|\-|\.]\\d{\
1
-\
31
}日?
评注:可用来匹配大多数年月日信息。
27
.匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计
2
,ASCII字符计
1
)
28
.匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
29
.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
30
.匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31
.匹配网址URL的正则表达式:[a-zA-z]+:
//[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
32
.匹配帐号是否合法(字母开头,允许
5
-
16
字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{
4
,
15
}$
评注:表单验证时很实用
33
.匹配腾讯QQ号:[
1
-
9
][
0
-
9
]\{
4
,\}
评注:腾讯QQ号从
10
000
开始
34
.匹配中国邮政编码:[
1
-
9
]\\d{
5
}(?!\d)
评注:中国邮政编码为
6
位数字
35
.匹配ip地址:((
2
[
0
-
4
]\\d|
25
[
0
-
5
]|[
01
]?\\d\\d?)\.){
3
}(
2
[
0
-
4
]\\d|
25
[
0
-
5
]|[
01
]?\\d\\d?)。
评注:提取ip地址时有用
|
如果验证条件更加复杂或者找不到想要的正则式,则可以参考这个地方,自己动手写一个出来:点击打开链接 。不过在使用之前,切记要先用工具测试一下。
上边说的是正则表达式,下边就说谓词如何与正则表达式联用。
在上一篇中我们介绍了谓词的语法,当谓词和正则联用时,我们就需要认识两个新的关键字:SELF、MATCHES。
self的意思是指代要验证的字符串本身,matches是一个字符串操作:表示匹配。我们用self+matches+正则表达式就可以拼接出一个谓词了。如:
1
2
3
4
5
6
7
8
9
|
// 判断字符串首字符是否为字母
NSString *string = @
"wo"
;
// 1、准备正则式
NSString *regex = @
"^[A-Za-z]*$"
;
// 只能是字母,不区分大小写
// 2、拼接谓词
NSPredicate *predicateRe1 = [NSPredicate predicateWithFormat:@
"self matches %@"
, regex];
// 3、匹配字符串
BOOL resualt = [predicateRe1 evaluateWithObject:string];
NSLog(@
"匹配结果%d"
, resualt);
|
打印的结果是:
1
|
2015
-
06
-
17
11
:
58
:
23.129
NSPredicate[
3183
:
277528
] 匹配结果
1
|
表示字符串符合正则式的要求。
系统还给我们提供了一个类,共我们使用正则表达式:NSRegularExpression。这个类非常简单,不做过多描述,大家看下边的例子,进入方法的头文件中可以了解更多用法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/**NSRegularExpression类和正则表达式联用
*
*
*
**/
// 1、创建NSRegularExpression对象并指定正则表达式
// 由于NSRegularExpression需要一个nserror对象,所以要先创建出来
NSError *error;
// 第一个参数是正则表达式,第二个参数是匹配操作的类型(枚举值),第三个是error的地址
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex
options:NSRegularExpressionCaseInsensitive
error:&error];
// 如果没有错误,则进行正则匹配
if
(!error) {
NSRange range = NSMakeRange(
0
, string.length);
// 第一个参数是要匹配的字符串,第二个参数是匹配操作的类型,第三个是要匹配字符串的范围
// 建议进入头文件查看其他方法
NSTextCheckingResult *match = [regularExpression firstMatchInString:string
options:NSMatchingReportProgress
range:range];
if
(match) {
NSLog(@
"NSRegularExpression匹配成功"
);
}
// 如果发生错误,打印错误类型
}
else
{
NSLog(@
"错误类型:%@"
,error);
}
|
打印的结果是:
1
|
2015
-
06
-
17
11
:
58
:
23.129
NSPredicate[
3183
:
277528
] NSRegularExpression匹配成功
|