字符串合法性检验
文章目录
前言
在日常的app使用中我们会发现账号和密码都是有要求的,比如字数要求和多种符号的要求,密码过短,全部为空格,全是数字,全是字母,包含非法字符
这些密码不仅安全性较低,也可能不符合项目需求。合理的密码规则不仅能够提高账号安全性,还能避免用户输入不符合要求的数据。
在 iOS 开发中,最常见的做法就是使用正则表达式配合 NSPredicate 来判断密码是否符合规则
正则表达式
正则表达式是一种用于匹配字符串格式的规则
例如
密码长度 6~16 位
必须包含字母和数字
只能包含大小写字母和数字
这时我们可以使用这么一串
objc
@"^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,16}$"
下面我们从左到右的顺序进行分析
objc
^
表示从密码的第一个字符开始匹配
(?=.*[A-Za-z])
正向预查
表示密码中起码要包含一个字母
. :表示任意一个字符
* :表示前面的表达式可以出现 0 次或多次
[A-Za-z] :表示任意大小写英文字母
咱们看到第二条可能会疑惑,可以出现0次,那怎么做到保证有一个字母呢
因为后边还跟一个[A-Za-z]就代表,在.*匹配结束的位置,后边必须紧跟一个字母,比如我们现在有一个密码123a,. *负责匹配123,但是一定要保证后边的[A-Za-z]也有可以匹配的,所以这个密码时合法的
objc
(?=.*\\d)
正向预查
密码中至少要出现一个数字
objc
\\d
表示数字的0~9
objc
[A-Za-z\\d]
代表只能由数字和字母组成,这样可以防止其他的非法符号
objc
{6,16}
前边的字符只能出现6~16次
objc
$
代表检查结束
如果我们想检验邮箱
objc
NSString *regex = @"^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
邮箱用户名可以包含字母、数字和 ._%+-必须有一个 @,@ 后面是域名最后必须有一个 . 和至少 2 位的后缀(如 com、cn、org)
好的,那一串"乱码"感觉和OC关系不大,我们怎么把它塞到我们的程序里面加以运用呢,这时候我们就要使用NSPredicate
NSPredicate
NSPredicate 是 Foundation 框架提供的一个条件判断类,可以根据指定规则对数据进行筛选或匹配。
在密码校验中,它会利用正则表达式判断字符串是否符合要求。
objc
NSString *regex = @"^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,16}$";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
就像这样,就可以把我们的正则表达式运用起来了
第二行的SELF MATCHES %@不能随便写,他是一种固定语法
SELF代表要判断的对象本身,也就是我们的密码MATCHES代表使用正则表达式进行匹配%@就是我们的正则表达式了
当然我们也可以使用其他匹配
objc
@"SELF == %@"
代表完全相等
objc
@"SELF CONTAINS %@"
代表包含某个字符串
objc
@"SELF LIKE %@"
代表通配符匹配
objc
NSString *password = self.passwordTF.text;
NSString *regex = @"^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,16}$";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL result = [pre evaluateWithObject:password];
if (result) {
NSLog(@"密码合法");
} else {
NSLog(@"密码不合法");
}
让regex去和password去匹配,根据得到的BOOL值得出是否合法

常用的通配符,限定符,定位符
| 通配符 / 元字符 | 含义 | 示例 | 可匹配 |
|---|---|---|---|
. |
匹配任意一个字符(除换行符外) | a.c |
abc、a1c、a@c |
\d |
匹配任意一个数字(0~9) | \d |
0、5、9 |
\D |
匹配任意一个非数字字符 | \D |
a、@ |
\w |
匹配字母、数字、下划线 | \w |
a、9、_ |
\W |
匹配非字母、数字、下划线 | \W |
#、@、! |
\s |
匹配空白字符(空格、Tab、换行等) | \s |
" "、\n、\t |
\S |
匹配非空白字符 | \S |
a、1、@ |
[abc] |
匹配 a、b 或 c 中任意一个 |
[abc] |
a、b、c |
[^abc] |
匹配除 a、b、c 外的任意一个字符 |
[^abc] |
d、1 |
[a-z] |
匹配任意一个小写字母 | [a-z] |
a、m、z |
[A-Z] |
匹配任意一个大写字母 | [A-Z] |
A、M、Z |
[A-Za-z] |
匹配任意一个英文字母 | [A-Za-z] |
A、b |
[0-9] |
匹配任意一个数字 | [0-9] |
3、8 |
| 数量词 | 含义 | 示例 | 可匹配 |
|---|---|---|---|
* |
前面的字符出现 0 次或多次 | a* |
""、a、aaa |
+ |
前面的字符出现 1 次或多次 | a+ |
a、aa |
? |
前面的字符出现 0 次或1次 | a? |
""、a |
{n} |
前面的字符出现 n 次 | \d{6} |
123456 |
{m,n} |
前面的字符出现 m~n 次 | [A-Za-z]{6,16} |
6~16 位字母 |
{m,} |
前面的字符至少出现 m 次 | a{3,} |
aaa、aaaa |
| 定位符 | 含义 | 示例 |
|---|---|---|
^ |
匹配字符串开始 | ^abc |
$ |
匹配字符串结束 | abc$ |
^...$ |
要求整个字符串都符合规则 | ^[A-Za-z]+$ |
NSRegularExpression
NSRegularExpression目前还没有使用到,但是我们可以作为拓展知识了解一下
NSRegularExpression 是 iOS 中 专门用来处理正则表达式的类,NSPredicate只能判断字符串符不符合规则返回 YES / NO),而NSRegularExpression可以按照规则去搜索、提取、替换字符串中的内容
现在有一段文字,我想提取出里面的手机号
objc
我的手机号是13812345678,备用手机号是15988889999
NSPredicate 不行,他只能告诉我这段话是不是手机号
objc
NSString *regex = @"1[3-9]\\d{9}";
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex options:0 error:nil];
这里的regular就是一个正则匹配器,options = 0代表使用默认模式,error会保存错误信息,我们这里不保存
objc
NSString *text = @"我的手机号是13812345678,备用手机号是15988889999";
NSArray *results = [regular matchesInString:text options:0 range:NSMakeRange(0, text.length)];
这段就是让匹配器去匹配这段话里符合规则的内容,并把结果返回
matchesInString是方法
range:NSMakeRange(0, text.length)表示检查范围
NSRegularExpression不仅可以做到查找,还可以用replaceMatchesInString:options:range:withTemplate进行替换,这个到后边可以了解一下
| 对比项 | NSPredicate | NSRegularExpression |
|---|---|---|
| 主要用途 | 判断字符串是否符合规则 | 查找、提取、替换字符串 |
| 返回结果 | YES / NO |
匹配结果(NSTextCheckingResult) |
| 使用难度 | 简单 | 稍复杂 |
| 适用场景 | 登录、注册、邮箱、手机号、密码校验 | 敏感词过滤、提取手机号、替换文本、批量匹配 |
| 是否支持正则 | 支持 | 支持 |
| 常用方法 | evaluateWithObject: |
matchesInString:、firstMatchInString:、replaceMatchesInString: |
总结
字符串检验是 iOS 开发中非常常见的功能,注册时验证密码格式,登录时验证账号格式,修改资料时验证邮箱、手机号等,学会这个可以让我们以后写的程序更严谨