字符串合法性检验

字符串合法性检验

文章目录

前言

在日常的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 %@不能随便写,他是一种固定语法

  1. SELF代表要判断的对象本身,也就是我们的密码
  2. MATCHES代表使用正则表达式进行匹配
  3. %@就是我们的正则表达式了

当然我们也可以使用其他匹配

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 开发中非常常见的功能,注册时验证密码格式,登录时验证账号格式,修改资料时验证邮箱、手机号等,学会这个可以让我们以后写的程序更严谨

相关推荐
茶底世界之下13 小时前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
Highcharts.js14 小时前
如何在macOS桌面应用集成Highcharts
macos·highcharts·前端可视化·交互图表
ZZH_AI项目交付14 小时前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y14 小时前
Swift深度链接的极简之道
ios·cocoa·swift
zaemyn202015 小时前
macOS 上 AccessClient 无法唤起?排查 Python 架构与 Windows App 识别问题
windows·python·macos·远程桌面·accessclient
AI砖家15 小时前
iPhone Duo 上架新规:旧 App 怎么兼容,还能不能继续更新?
ios·cocoa·iphone·ios上架·ios上架新规
黑科技iOS上架16 小时前
小蟹iOS混淆:Objective-C项目实战
ios·审核·ios混淆·执行程序差异化
茶底世界之下16 小时前
照片边缘太抢眼?用 Awaking 做一次 1:1 裁切
ios
Digitally16 小时前
如何在iPhone上永久删除文件而无需恢复
ios·iphone
黑科技iOS上架17 小时前
iOS二进制混淆实战:工程级指纹防护彻底解决4.3同质化拒审
ios·审核·ios混淆·执行程序差异化