在项目中,我们在验证用户的输入,最简单的方法就是使用正则表达式了,ios系统也提供很方便的方法,让我们可以轻松的来验证用户名,密码,身份证好 ,手机号等;
下面附上我在项目中用到的正则表达式的验证方法,
由于比较常用,大家最好封装成+静态的方法,便于使用:
我把常用的方法,使用静态方法封装到一个 Utils类里面,直接使用类名调用即可:
头文件:
使用方法示例:
扩展NSString,添加以下方法:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
-
(
BOOL
)
hyb
_
isValidPersonID
{
return
[
NSString
hyb_isValidPersonID
:self
]
;
}
+
(
BOOL
)
hyb_isValidPersonID
:
(
NSString
*
)
personId
{
// 判断位数
if
(
personId
.
length
!=
15
&&
personId
.
length
!=
18
)
{
return
NO
;
}
NSString
*carid
=
personId
;
long
lSumQT
=
0
;
// 加权因子
int
R
[
]
=
{
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
}
;
// 校验码
unsigned
char
checkers
[
11
]
=
{
'1'
,
'0'
,
'X'
,
'9'
,
'8'
,
'7'
,
'6'
,
'5'
,
'4'
,
'3'
,
'2'
}
;
// 将15位身份证号转换成18位
NSMutableString
*str
=
[
NSMutableString
stringWithString
:personId
]
;
if
(
personId
.
length
==
15
)
{
[
str
insertString
:
@"19"
atIndex
:
6
]
;
long
p
=
0
;
const
char
*personId
=
[
str
UTF8String
]
;
for
(
int
i
=
0
;
i
<=
16
;
i
++
)
{
p
+=
(
personId
[
i
]
-
48
)
*
R
[
i
]
;
}
int
o
=
p
%
11
;
NSString
*string_content
=
[
NSString
stringWithFormat
:
@"%c"
,
checkers
[
o
]
]
;
[
str
insertString
:string_content
atIndex
:
[
str
length
]
]
;
carid
=
str
;
}
// 判断地区码
NSString
*
sProvince
=
[
carid
substringToIndex
:
2
]
;
if
(
!
[
self
_areaCode
:sProvince
]
)
{
return
NO
;
}
// 判断年月日是否有效
// 年份
int
strYear
=
[
[
self
_substringWithString
:carid
begin
:
6
end
:
4
]
intValue
]
;
// 月份
int
strMonth
=
[
[
self
_substringWithString
:carid
begin
:
10
end
:
2
]
intValue
]
;
// 日
int
strDay
=
[
[
self
_substringWithString
:carid
begin
:
12
end
:
2
]
intValue
]
;
NSTimeZone
*localZone
=
[
NSTimeZone
localTimeZone
]
;
NSDateFormatter
*dateFormatter
=
[
[
NSDateFormatter
alloc
]
init
]
;
[
dateFormatter
setDateStyle
:NSDateFormatterMediumStyle
]
;
[
dateFormatter
setTimeStyle
:NSDateFormatterNoStyle
]
;
[
dateFormatter
setTimeZone
:localZone
]
;
[
dateFormatter
setDateFormat
:
@"yyyy-MM-dd HH:mm:ss"
]
;
NSDate
*date
=
[
dateFormatter
dateFrostr
:
[
NSString
stringWithFormat
:
@"%d-%d-%d 12:01:01"
,
strYear
,
strMonth
,
strDay
]
]
;
if
(
date
==
nil
)
{
return
NO
;
}
const
char
*pid
=
[
carid
UTF8String
]
;
// 检验长度
if
(
18
!=
strlen
(
pid
)
)
return
NO
;
// 校验数字
for
(
int
i
=
0
;
i
<
18
;
i
++
)
{
if
(
!
isdigit
(
pid
[
i
]
)
&&
!
(
(
'X'
==
pid
[
i
]
||
'x'
==
pid
[
i
]
)
&&
17
==
i
)
)
{
return
NO
;
}
}
// 验证最末的校验码
for
(
int
i
=
0
;
i
<=
16
;
i
++
)
{
lSumQT
+=
(
pid
[
i
]
-
48
)
*
R
[
i
]
;
}
if
(
checkers
[
lSumQT
%
11
]
!=
pid
[
17
]
)
{
return
NO
;
}
return
YES
;
}
#pragma mark - Private
+
(
NSString
*
)
_substringWithString
:
(
NSString
*
)
str
begin
:
(
NSInteger
)
begin
end
:
(
NSInteger
)
end
{
return
[
str
substringWithRange
:NSMakeRange
(
begin
,
end
)
]
;
}
|
这段代码是严格地验证15位和18位的身份证的,并且x/X是不同的,x是不能通过的。