美文网首页
iOS正则的基本使用

iOS正则的基本使用

作者: Sky109 | 来源:发表于2018-01-10 11:12 被阅读27次

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。这种公式语法优美简洁,经常被我们开发用来匹配字符串,封装成各种判断方法;

    image

    正则表达式

    先举个简单例子,比如输入框输入一个6~12位的密码,很多人会这样写:

    if(textField.text.length >= 6 && textField.text.leng <= 12);

    这样写没有错,也是绝大多部分同学写的方法,但是你用正则表达式判断则是:

    ^.{6,12}$

    是不是非常简洁?再比如纯数字验证:

    ^[0-9]+$

    可能初学者并不懂上面的符号代表着什么意思,现在我为大家解释下什么意思:

    1、^和$属于特殊符号,他们的作用是分别指出一个字符串的开始和结束

    例:“^one”:表示所有以”one”开始的字符串(”one mouse”,”one123456″,·····);

    相当于iOS的方法:- (BOOL)hasPrefix:(NSString *)aString;

    “a dog$”:表示所以以”a dog”结尾的字符串(”this is a dog”,·····);

    类似于:- (BOOL)hasSuffix:(NSString *)aString;

    2、{n}表示匹配字符重复n次;{n,}匹配重复n次或更多次;{n,m}匹配重复n到m之间次数。所以{6,12}则表示6~12位字符

    3、.符号表示任一字符(除换行符之外),所以{6,12}跟在.符号后面则表示6至12位长度的字符串,所以^.{6,12}$能够匹配密码;

    4、[0-9]:表示一个字符串包含'0'到'9'中的一个;

    5、+表示后面跟着至少一个前一位的字符;所以^[0-9]+$可以匹配纯数字;

    解释到应该上面两个正则表达式感觉很简单,是不是瞬间也觉得该语法也特别精悍,不过整个语法不可能这么简单,比如下面的表达式:

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

    我们慢慢分析一下:

    1、.符号上面说了表示任一字符(除换行符之外),但是.符号是不限制字符的,匹配度太高,所以该语法又提供了\d表示任意的单个数字,\w表示26个字母;\s表示空格Tab换行;

    2、{n}表示匹配字符重复n次

    3、?表示前一个字符为0或者1个;

    综上所述,上面的表达式表示以0开头接着两位数字,再接着一个'-'符号或者没有'-'符号,后面再接着8位数字,所以大概写一下是不是也很熟悉?010-13236782或者01013236782,没错,这就是中国固定电话的匹配方式,因为大部分的固定电话都是0区号-八位数字的格式!

    不过有人会问,表达式是\d而不是\d,这如何解释?

    **注意:这是因为\本身是转义符号,为了保证表达式能正常匹配,我们要给\进行一次转义,所以就变成了\ **

    //需要转义的字符* + ? $ ^ . | \ ( ) { } [ ]

    下面就列举下正则表达式的基本语法:

    ’^'和’$'表示一个字符串的开始和结束

    ’,’+'和’?'这三个符号,表示一个或N个字符重复出现的次数。它们分别表示“没有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“没有或一次”([0,1]取整)。下面是几个例子:

    “ab”:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);

    “ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);

    “ab?”:表示一个字符串有一个a后面跟着零个或者一个b( ”a”, “ab”);

    “a?b+$”:表示在字符串的末尾有零个或一个a跟着一个或几个b( ”b”, “ab”,”bb”,”abb”,……)。

    可以用大括号括起来({}),表示一个重复的具体范围。例如

    “ab{4}”:表示一个字符串有一个a跟着4个b(”abbbb”);

    “ab{1,}”:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);

    “ab{3,4}”:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)。那么,“

    ”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示

    注意:可以没有下限,但是不能没有上限!例如“ab{,5}”是错误的写法

    “ | ”表示“或”操作:

    “a|b”:表示一个字符串里有”a”或者”b”;

    “(a|bcd)ef”:表示”aef”或”bcdef”;

    “(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一个”c”;

    方括号”[ ]“表示在括号内的众多字符中,选择1-N个括号内的符合语法的字符作为结果,例如

    “[ab]“:表示一个字符串有一个”a”或”b”(相当于”a|b”);

    “[a-d]“:表示一个字符串包含小写的’a'到’d'中的一个(相当于”a|b|c|d”或者”[abcd]“);

    “^[a-zA-Z]“:表示一个以字母开头的字符串;

    “[0-9]a”:表示a前有一位的数字;

    “[a-zA-Z0-9]$”:表示一个字符串以一个字母或数字结束。

    “.”匹配除“\r\n”之外的任何单个字符:

    “a.[a-z]“:表示一个字符串有一个”a”后面跟着一个任意字符和一个小写字母;

    “^.{5}$”:表示任意1个长度为5的字符串;

    “\num”其中num是一个正整数。表示”\num”之前的字符出现相同的个数,例如

    “(.)\1″:表示两个连续的相同字符。

    “10{1,2}” : 表示数字1后面跟着1或者2个0(“10″,”100″)

    ” 0{3,} ”表示数字为至少3个连续的0 (“000”,“0000”,······)

    在方括号里用’'表示不希望出现的字符,’'应在方括号里的第一位。

    “@[^a-zA-Z]4@”表示两个”@”中不应该出现字母)。

    常用的还有:

    “ \d ”匹配一个数字字符。等价于[0-9]

    “ \D”匹配一个非数字字符。等价于[^0-9]

    “ \w ”匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”

    “ \W ”匹配任何非单词字符。等价于“[^A-Za-z0-9_]”

    这里只是列举了常用语法,想要知道更多,自行百度!

    理解了基本语法,现在让我们自己动手来实践一下,比如怎么写匹配电子邮箱的正则表达式:

    1、首先先看看电子邮箱格式是怎样的?比如以下邮箱:test@hotmail.comtest@sina.vip.comte-st@qq.com.cnte_st@sina.vip.comt.e_st@si-na.vip.com2、开始必须是一个或者多个单词字符中间或穿插特殊字符-._,加上@,然后又是一个或者多个单词字符或者是-.。然后是点“.”和单词字符和-.的组合,可以有一个或者多个组合,邮箱域至少有一个“.”和两个单词,再严格点那么最后的顶级域至少要2个字母不能是数字,特殊字符不会出现在首尾两端!3、所以综合上诉得出:^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$

    当然,正则表达式不止一种写法,有非常多的写法,然后根据自己项目的规则也写法不一样,有些判断的稍微宽松点,这都是灵活性的,不要死板说别人的就是错的,比如[参考]杨元庆@联想.中国这样都是可以的呢,规则一直在变!

    在iOS里面运用正则表达式判断需要用到谓词NSPredicate,代码如下:

    + (BOOL)isValidateEmail:(NSString*)email {
      NSString*emailRegex =@"^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
      NSPredicate*emailTest = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];return[emailTest   evaluateWithObject:email];   
     }
    

    所有用正则表达式判断的都是上诉方法,只是改变表达式就可以,下面列举了些常用的正则表达式:

    1、手机号:^[1][34578]\\d{9}$

    2、身份证号:^(\\d{14}|\\d{17})(\\d|[xX])$电子邮箱:^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$

    3、车牌号:^[\u4e00-\u9fff]{1}[a-zA-Z]{1}[-][a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fff]$//其中\u4e00-\u9fa5表示unicode编码中汉字已编码部分,\u9fa5-\u9fff是保留部分,将来可能会添加;湘K-DE829 香港车牌号码:粤Z-J499港

    4、mac地址:^([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}$

    5、url:^((http)|(https))+:[^\\s]+\\.[^\\s]*$

    6、邮政编码:^[1-9]\\d{5}(?!\d)$

    7、汉字:^[\u4e00-\u9fa5]+$

    8、是否含有^%&’,;=?$\”等字符:^[^%&’,;=?$\x22]+$

    9、不允许特殊符号(如:用户名6-20位):^[a-zA-Z0-9]{6,20}$

    10、密码强度(一个或以上的大写字母以及小写字母):^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$


    OC中正则表达式的使用步骤:

    编写正则表达式的样式:

    NSString *string= @"5347858h7";
    

    初始化正则表达式:

    NSRegularExpression*regex = [[NSRegularExpressionalloc] initWithPattern:pattern options:0 error:nil];
    

    匹配字符串并返回结果:

    NSArray *results = [regex matchesInString:stringoptions:0range:NSMakeRange(0,string.length)];
    

    输出结果:

    for(NSTextCheckingResult*resultinresults) {
    NSLog(@"范围:%@ 结果:%@",NSStringFromRange(result.range), [string substringWithRange:result.range]);
    }
    

    相关文章

      网友评论

          本文标题:iOS正则的基本使用

          本文链接:https://www.haomeiwen.com/subject/kaznnxtx.html