字符串合法性检验文章目录字符串合法性检验前言正则表达式NSPredicate常用的通配符限定符定位符**NSRegularExpression**总结前言在日常的app使用中我们会发现账号和密码都是有要求的比如字数要求和多种符号的要求密码过短全部为空格全是数字全是字母包含非法字符这些密码不仅安全性较低也可能不符合项目需求。合理的密码规则不仅能够提高账号安全性还能避免用户输入不符合要求的数据。在 iOS 开发中最常见的做法就是使用正则表达式配合NSPredicate来判断密码是否符合规则正则表达式正则表达式是一种用于匹配字符串格式的规则例如密码长度 6~16 位 必须包含字母和数字 只能包含大小写字母和数字这时我们可以使用这么一串^(?.*[A-Za-z])(?.*\\d)[A-Za-z\\d]{6,16}$下面我们从左到右的顺序进行分析^表示从密码的第一个字符开始匹配(?.*[A-Za-z])正向预查表示密码中起码要包含一个字母.表示任意一个字符*表示前面的表达式可以出现 0 次或多次[A-Za-z]表示任意大小写英文字母咱们看到第二条可能会疑惑可以出现0次那怎么做到保证有一个字母呢因为后边还跟一个[A-Za-z]就代表在.*匹配结束的位置后边必须紧跟一个字母比如我们现在有一个密码123a. *负责匹配123但是一定要保证后边的[A-Za-z]也有可以匹配的所以这个密码时合法的(?.*\\d)正向预查密码中至少要出现一个数字\\d表示数字的09[A-Za-z\\d]代表只能由数字和字母组成这样可以防止其他的非法符号{6,16}前边的字符只能出现616次$代表检查结束如果我们想检验邮箱NSString*regex^[A-Z0-9a-z._%-][A-Za-z0-9.-]\\.[A-Za-z]{2,}$;邮箱用户名可以包含字母、数字和._%-必须有一个后面是域名最后必须有一个.和至少 2 位的后缀如com、cn、org好的那一串乱码感觉和OC关系不大我们怎么把它塞到我们的程序里面加以运用呢这时候我们就要使用NSPredicateNSPredicateNSPredicate是 Foundation 框架提供的一个条件判断类可以根据指定规则对数据进行筛选或匹配。在密码校验中它会利用正则表达式判断字符串是否符合要求。NSString*regex^(?.*[A-Za-z])(?.*\\d)[A-Za-z\\d]{6,16}$;NSPredicate*pre[NSPredicate predicateWithFormat:SELF MATCHES %,regex];就像这样就可以把我们的正则表达式运用起来了第二行的SELF MATCHES %不能随便写他是一种固定语法SELF代表要判断的对象本身也就是我们的密码MATCHES代表使用正则表达式进行匹配%就是我们的正则表达式了当然我们也可以使用其他匹配SELF %代表完全相等SELF CONTAINS %代表包含某个字符串SELF LIKE %代表通配符匹配NSString*passwordself.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.cabc、a1c、ac\d匹配任意一个数字0~9\d0、5、9\D匹配任意一个非数字字符\Da、\w匹配字母、数字、下划线\wa、9、_\W匹配非字母、数字、下划线\W#、、!\s匹配空白字符空格、Tab、换行等\s 、\n、\t\S匹配非空白字符\Sa、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 次或多次aa、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]$NSRegularExpressionNSRegularExpression目前还没有使用到但是我们可以作为拓展知识了解一下NSRegularExpression是 iOS 中 专门用来处理正则表达式的类NSPredicate只能判断字符串符不符合规则返回 YES / NO而NSRegularExpression可以按照规则去搜索、提取、替换字符串中的内容现在有一段文字我想提取出里面的手机号我的手机号是13812345678备用手机号是15988889999NSPredicate不行他只能告诉我这段话是不是手机号NSString*regex1[3-9]\\d{9};NSRegularExpression*regular[NSRegularExpression regularExpressionWithPattern:regex options:0error:nil];这里的regular就是一个正则匹配器options 0代表使用默认模式error会保存错误信息我们这里不保存NSString*text我的手机号是13812345678备用手机号是15988889999;NSArray*results[regular matchesInString:text options:0range:NSMakeRange(0,text.length)];这段就是让匹配器去匹配这段话里符合规则的内容并把结果返回matchesInString是方法range:NSMakeRange(0, text.length)表示检查范围NSRegularExpression不仅可以做到查找还可以用replaceMatchesInString:options:range:withTemplate进行替换这个到后边可以了解一下对比项NSPredicateNSRegularExpression主要用途判断字符串是否符合规则查找、提取、替换字符串返回结果YES / NO匹配结果NSTextCheckingResult使用难度简单稍复杂适用场景登录、注册、邮箱、手机号、密码校验敏感词过滤、提取手机号、替换文本、批量匹配是否支持正则支持支持常用方法evaluateWithObject:matchesInString:、firstMatchInString:、replaceMatchesInString:总结字符串检验是 iOS 开发中非常常见的功能注册时验证密码格式登录时验证账号格式修改资料时验证邮箱、手机号等学会这个可以让我们以后写的程序更严谨