字符串合法性检验

字符串合法性检验

文章目录

前言

在日常的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 位的后缀(如 comcnorg

好的,那一串"乱码"感觉和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 abca1ca@c
\d 匹配任意一个数字(0~9) \d 059
\D 匹配任意一个非数字字符 \D a@
\w 匹配字母、数字、下划线 \w a9_
\W 匹配非字母、数字、下划线 \W #@!
\s 匹配空白字符(空格、Tab、换行等) \s " "\n\t
\S 匹配非空白字符 \S a1@
[abc] 匹配 abc 中任意一个 [abc] abc
[^abc] 匹配除 abc 外的任意一个字符 [^abc] d1
[a-z] 匹配任意一个小写字母 [a-z] amz
[A-Z] 匹配任意一个大写字母 [A-Z] AMZ
[A-Za-z] 匹配任意一个英文字母 [A-Za-z] Ab
[0-9] 匹配任意一个数字 [0-9] 38
数量词 含义 示例 可匹配
* 前面的字符出现 0 次或多次 a* ""aaaa
+ 前面的字符出现 1 次或多次 a+ aaa
? 前面的字符出现 0 次或1次 a? ""a
{n} 前面的字符出现 n 次 \d{6} 123456
{m,n} 前面的字符出现 m~n 次 [A-Za-z]{6,16} 6~16 位字母
{m,} 前面的字符至少出现 m 次 a{3,} aaaaaaa
定位符 含义 示例
^ 匹配字符串开始 ^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 开发中非常常见的功能,注册时验证密码格式,登录时验证账号格式,修改资料时验证邮箱、手机号等,学会这个可以让我们以后写的程序更严谨

相关推荐
末代iOS程序员华仔21 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
flutter·ios·figma
2501_916008891 天前
苹果上架工具怎么选 不用 Mac 上架 App Store 的几种方案
android·macos·ios·小程序·uni-app·iphone·webview
鹤卿1231 天前
谓词与正则表达式(OC)
ios·正则表达式·objective-c·xcode
秋雨梧桐叶落莳1 天前
iOS——3GShare项目总结
学习·macos·ios·objective-c·cocoa
酉鬼女又兒2 天前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南
大数据·网络·数据库·人工智能·macos·机器人·github
AIsoft_86882 天前
iOS端录音转文字工具实测:自媒体创作者高效整理指南
ios·媒体
独隅2 天前
DevEco Code 在 MacOS 系统上的完整安装、配置与卸载全面使用指南(简略版)
macos·华为·harmonyos
库奇噜啦呼2 天前
【iOS】Core Data
ios
Swift社区3 天前
Mac与Windows终端常用指令对比整理(实用避坑分享)
macos