IOS开发常用的正则表达式

正则表达式是一种用来进行文本匹配的工具,其语法优美简洁。在开发中,查找、对比以及匹配字符串是家常便饭的业务,通过正则表达式我们将这些业务描述成某些需求规则,来让我们的代码更美观、实用。例如我们要验证用户输入的密码长度是否满足6~18位的长度,新手最常见的验证方式是判断输入的密码长度

return (textField.text.length >= 6 && textField.text.leng <= 18);

尽管这种判断方式没有任何问题,而上面的验证换做正则表达式的匹配字符就显得短小精悍

^.{6,18}$

还有,大部分的固定电话都是0区号-八位数字的格式,那么正则表达式的匹配如下

^0\\d{2}\-?\\d{8}$

再比如,对于密码强度的认证。如今的密码应该包括一个或以上的大写字母以及小写字母,对此正则表达式的匹配是

(^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$)

表达式字符解析

如果是新手开发者,那么很有可能不理解上面的正则表达式。那么我们先看第一个匹配条件,匹配6-18位的密码长度。根据题目的要求,就能够轻易的判断出{6,18}表示6-18位。其中,{n}匹配字符重复n次;{n,}匹配重复n次或更多次;{n,m}匹配重复n到m之间次数。

那么读者对^、.和$三个符号可能不明所以。^和$属于特殊符号,前者表示匹配字符串的开头,后者表示匹配字符串的结尾。由于我们有时需要在一段很长的字符串中匹配某些小片段字符串时(比如在图文混编中匹配长字符串中留空的表情符号),适当使用这两个符号可以减少匹配次数,提高执行效率。

那么结合这几个字符代表含义,可以得出.符号表示任一字符(除换行符之外)。那么还可以得出{6,18}这个特殊符号表示的是前一个符号代表的位数。结合起来说^.{6,18}$匹配一段6至18位长度的字符串,所以可以用来验证密码长度

当然了,.字符的匹配率太高,更多时候我们需要匹配的是具体到数字或者字母,甚至准确的数字和字母。那么除了.字符以外,还有\d用来表示任意的单个数字,\w表示任意一个字母或数字或者直接使用0-9的任意数字表示具体数字。而特殊符号?表示前一个字符为0或者1个。

所以上面的^0\\d{2}\-?\\d{8}$匹配了以数字0开头,接着两个数字,后面跟着-号跟八个数字,然后结尾的字符串,不管是010-88888888,还是02098989898都能进行正确匹配。

最后的一个表达式可能是最复杂的表达式,根据上面对部分符号的解析。我们可以把

^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$

拆分成  ^.*[A-Z]+.*[a-z]+.*$  跟  ^.*[a-z]+.*[A-Z]+.*$

这两个单独的表达式,而中间的|不难猜到就是逻辑的或。我们将对前一个进行拆分,来一步步识别这个表达式的匹配规则。这里教大家我拆分表达式的方法:我把表达式的字符分为两类:值表达和修饰表达。所谓值表达就是说这个符号表示了某个值,就像\d表示数字,.表示任意非换行符字符。修饰表达用来修饰值达成某种条件,比如{2}表示前面一个值重复两次,*表示前一个值重复0次或者更多次。根据这种方法,那么^.*[A-Z]+.*[a-z]+.*$可以拆分成部分:^$、 .* 、 [A-Z]+ 、 [a-z]+。

^$就不再多说。

.*这里要介绍的就是*表示前一个值符号重复任意次数。

[A-Z]+中-表示从左边的值到右边的值之间所有值形成的闭集合;[]方括号表示的值必须是括号中间集合的子集,要注意的是括号里面可以有多个集合,比如[A-Z0-9a-z]表示匹配任意一个大小写字母或数字;+同*有点像,但是+表示的是至少一个的重复值。

结合上面的解析,那么^.*[A-Z]+.*[a-z]+.*$表示以任意数量的字符开头,然后跟着一个大写字母,大写字母后面有任意数量的字符以及一个小写字母,然后又是任意数量的数字、字母或者字符。而^.*[a-z]+.*[A-Z]+.*$表示小写字母在大写字母前面任意数量的字符的位置,两个结合匹配可以确保字符串中包括至少一个小写字母和一个大写字母。

ps:有一点要注意,上面展示的表达式解析时\d这些特殊符号在我们的代码中多了一个\,这是因为\本身是转义符号,为了保证表达式能正常匹配,我们要给\进行一次转义,所以就变成了\\。基本上所有的符号字符都需要转义。

语法/字符说明表

值表达

.      匹配除换行符外的任意字符

\w   匹配字母或者数字的字符

\W   匹配任意不是字母或数字的字符

\s    匹配任意的空白符(空格、制表符、换行符)

\S    匹配任意不是空白符的字符

\d    匹配任意数字

\D    匹配任意非数字的字符

\b    匹配单词的结尾或者开头的字符

\B    匹配任意不是单词结尾或开头的字符

[^x]  匹配任意非x的字符。如[^[a-z]]匹配非小写字母的任意字符

^      匹配字符串的开头

$      匹配字符串的结尾

修饰表达

*     匹配重复任意次数

+    匹配重复一次以上的次数

?      匹配一次或零次

{n}    匹配重复n次

{n,}   匹配重复n次或n次以上

{n,m} 匹配重复最少n次最多m次

除了上面列出的字符外,还有包括表示位置指定等较难运用的其他正则表达式,但上面的字符已经足够我们正常使用了。想了解更多知识可以度娘Google。

代码实操

上面我们只是简单的讲解了正则表达式中各个字符代表的意义,那么在iOS开发中应该怎么使用。对于有意使用正则规则来匹配的开发者,我的建议是封装成为类别方法,一次封装,多次调用。下面用我自己封装的代码进行说明。这些方法通过扩展UITextField方法来实现:

@interface UITextField (LXDValidate)
/*! 判断文本框是否为空(非正则表达式)*/
- (BOOL)isEmpty;
/*! 判断邮箱是否正确*/
- (BOOL)validateEmail;
/*! 判断验证码是否正确*/
- (BOOL)validateAuthen;
/*! 判断密码格式是否正确*/
- (BOOL)validatePassword;
/*! 判断手机号码是否正确*/
- (BOOL)validatePhoneNumber;
/*! 自己写正则传入进行判断*/
- (BOOL)validateWithRegExp: (NSString *)regExp;
@end

方法实现文件:

#import "UITextField+LXDValidate.h"
@implementation UITextField (LXDValidate)
- (BOOL)isEmpty
{
return self.text.length == ;
}
- (BOOL)validateEmail
{
return [self validateWithRegExp: @"^[a-zA-Z-]{,}@[a-z-A-Z]{,}\\.[a-zA-Z]{,}$"];
}
- (BOOL)validateAuthen
{
return [self validateWithRegExp: @"^\\d{,}$"];
}
- (BOOL)validatePassword
{
NSString * length = @"^\\w{,}$";    //长度
NSString * number = @"^\\w*\\d+\\w*$";   //数字
NSString * lower = @"^\\w*[a-z]+\\w*$";   //小写字母
NSString * upper = @"^\\w*[A-Z]+\\w*$";  //大写字母
return [self validateWithRegExp: length] && [self validateWithRegExp: number] && [self validateWithRegExp: lower] && [self validateWithRegExp: upper];
}
- (BOOL)validatePhoneNumber
{
NSString * reg = @"^\\d{}$";
return [self validateWithRegExp: reg];
}
- (BOOL)validateWithRegExp: (NSString *)regExp
{
NSPredicate * predicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regExp];
return [predicate evaluateWithObject: self.text];
}
@end

以上内容是小编给大家介绍的有关IOS开发常用的正则表达式,希望大家喜欢。

(0)

相关推荐

  • iOS App开发中Objective-C使用正则表达式进行匹配的方法

    iOS中有三种方式来实现正则表达式的匹配.现在将他们都记录在这里: 1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @"nijino_saki@163.com": NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *predicate = [NSPredicate predicateWithForma

  • 正则表达式在IOS中的应用及IOS中三种正则表达式的使用与比较

    正则表达式在ios中应用 一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式达到字符串的复杂控制. 二.正则表达式的语法 看一个过滤纯数字的例子 - (BOOL)validateNumber:(NSString *) textString { NSString* number=@"^[0-9]+$"; NSPredicate *numbe

  • iOS验证手机号的正则表达式

    本文实例为大家分享了iOS正则验证手机号的代码片段,供大家参考,具体内容如下 //判断手机号码格式是否正确 + (BOOL)valiMobile:(NSString *)mobile { mobile = [mobile stringByReplacingOccurrencesOfString:@" "withString:@""]; if (mobile.length != 11) { return NO; }else{ /** * 移动号段正则表达式 */ NS

  • iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容

    何谓正则表达式 正则表达式(regular expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的.正则表达式通常缩写成"regex",单数有regexp.regex,复数有regexps.regexes.regexen. 正则表达式组成 正则表达式有两种类型的字符

  • iOS开发验证判断语句之正则表达式小结

    前言 大家都知道开发一直离不开一些常用验证格式,比如:邮箱,手机号等等,在开发过程中一般都会新建一个工具类,专门管理这些验证方式,简便开发过程.一般都采用正则表达式的形式来做判断,本文列举一些项目中非常实用的一些正则表达式的判断语句,以后开发起来直接复制粘贴就可以,这样大大节省了开发时间,下面不多说,直接上代码. 一.验证移动手机号: + (BOOL)isMobile:(NSString*)mobile { NSString *regex = @"^1+[34578]+\d{9}";

  • iOS正则表达式验证手机号、邮箱、身份证号等

    本文实例为大家分享了常用的iOS正则表达式,供大家参考,具体内容如下 #import "NSString+RegexCategory.h" @implementation NSString (RegexCategory) #pragma mark - 正则相关 - (BOOL)isValidateByRegex:(NSString *)regex{ NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCH

  • iOS 正则表达式判断手机号码、固话

    话不多说,请看代码: { if (mobileNum.length != 11) { return NO; } /** * 手机号码: * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9] * 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 * 联通号段: 130

  • iOS中正则表达式的运用示例代码

    前言 有时我们需要在一大段长文本中过滤出我们需要的字段,或者检验该文本是否符合要求(该文本是否是邮箱,链接,电话号码或身份证),这时候就需要用到正则表达式了,iOS中也加入了相关的类来支持正则表达式的使用.本文详细介绍了关于iOS正则表达式运用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.NSRegularExpression 1. 正则表达式的创建 + (nullable NSRegularExpression *)regularExpressionWith

  • iOS 中使用正则表达式判断身份证格式及银行卡号格式是否正确(推荐)

    1.有时候我们会用到上传身份证号,或者银行卡号,这个时候就需要我们对身份证号以及银行卡号,进行基本的判断. 下面便是身份证号的判断返回YES是合法,反之不合法 #pragma mark 判断身份证号是否合法 - (BOOL)judgeIdentityStringValid:(NSString *)identityString { if (identityString.length != 18) return NO; // 正则表达式判断基本 身份证号是否满足格式 NSString *regex2

  • iOS 正则表达式判断纯数字及匹配11位手机号码的方法

    第一种使用正则表达式 判断 //是否是纯数字 + (BOOL)isNumText:(NSString *)str{ NSString * regex = @"(/^[0-9]*$/)"; NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; BOOL isMatch = [pred evaluateWithObject:str]; if (isMatch)

随机推荐