OC 正则表达式的语法及使用

正则表达式就是可以分段进行匹配的语法规则,判断字符串中的每一个片段是否能够相应的内容规则匹配。
基本语法:

1.一般字符,除了元字符外的字符都是一般字符,匹配的就是字符的字面意思。

2.元字符,特殊字符,不是匹配的字符字面量。
.         表示除换行符以外的任意字符;
*        表示它前面的那个表达式重复0次或若干次;
          eg:“ab*”表示“a”或“ab”或“abb”…
+        表示它前面的那个表达式重复至少1次;
          eg:“ab+”表示“ab”或“abb”或“abbb”…
?        表示它前面的那个表达式存在或不存在;
          eg:“ab?”表示“a”或“ab”
^        表示以它后面的表达式开头的字符串;
          eg:“^abc”表示以“abc”开头的字符串
$        表示以它前面的表达式结尾的字符串;
          eg:“abc$”表示以“abc”结尾的字符串
[ ]       表示内容的范围;
          eg:“[a-zA-Z]”表示任一字母;“[ab]”表示“a”或“b”
{}       表示数量的范围;
           eg:“{2}”表示2个;“{2,5}”表示2个到5个;“{3,}”表示至少3个;
|         表示 或;
          eg:“a|b”表示“a”或“b”
\num  num为一个整数,表示前面的表达式复制num次;
          eg:“(ab)\3”表示“ababab”
\b       表示单词的开始或结束;
\d       表示数字,相当于“[0-9]”;
\s       表示任意空白符;
\w      表示任意字符数字或下划线或汉字,相当于“[a-zA-Z0-9\u4E00-\u9FFF_]”

3.字符转义
\        表示字符转义,如果我们要使用元字符的字面意思的话,就需要转义字符进
         行字符转义。
         eg:“\.”表示“.”;“\*”表示“*”;“\\”表示“\”;

4.反义字符
\W      表示不是字符数字下划线或者汉字的字符;
\S       表示任意不是空白符的字符;
\D       表示不是数字的字符;
\B       表示不是单词开头或结束的位置;
[^x]     表示除“x”外的任意字符;
[^abc] 表示除“a”“b”“c”外的任意字符;

OC中正则表达式的写法又有些微的不同,使用转义字符作用在元字符(. $ | ( ) [ { ^ ? * + \)上的时候要在转义字符前再加“\”。eg:正常规则下,“.”表示换行符以外的任意字符,“\.”表示“.”;在OC中,“.”依然表示换行符以外的任意字符,“\\.”表示“.”。简单点理解就是按正常的规则先写表达式,然后把写好的表达式中的所有“\”都替换为“\\”即可。

更多正则表达式的语法可参考http://deerchao.net/tutorials/regex/regex.htm

几个实例:

邮箱格式验证:
- (BOOL)validateEmail:(NSString *)email {
    NSString *aimStr = [email stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *regex = @"^[a-zA-Z0-9]\\w*@[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}$";
    NSPredicate *emailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [emailValidate evaluateWithObject:email];
}
手机号码验证
//联通号段:130 131 132 145 146 155 156 166 171 175 176 185 186
//移动号段:134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
//电信号段:133 149 153 173 174 177 180 181 189 199
- (BOOL)validatePhone:(NSString *)phone {
    NSString *aimStr = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *CUregex = @"^1(3[012]|4[56]|5[56]|66|7[156]|8[56])[0-9]{8}$";
    NSString *CMregex = @"^1(3[4-9]|4[78]|5[012789]|7[28]|8[23478]|98)[0-9]{8}$";
    NSString *CTregex = @"^1(33|49|53|7[347]|8[019]|99)[0-9]{8}$";
    NSPredicate *CUemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CUregex];
    NSPredicate *CMemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CMregex];
    NSPredicate *CTemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CTregex];
    if ([CUemailValidate evaluateWithObject:aimStr]||[CMemailValidate evaluateWithObject:aimStr]||[CTemailValidate evaluateWithObject:aimStr]) {
        return YES;
    }
    return NO;
}
车牌号验证
//除了原有的五位车牌号之外,增加两种新能源汽车车牌号,小型家庭用车:在城市码之后加D或F,再加五位编码;大型汽车:城市码之后是五位编码,再加D或F;D和F分别表示纯电动车和混合动力汽车。
- (BOOL)validateCarNumber:(NSString *)carNo {
    NSString *aimStr = [carNo stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *regex = @"^[\\u4E00-\\u9FFF][a-zA-Z]([DFdf][a-zA-Z0-9]{5}|[A-Za-z0-9]{5}|[a-zA-Z0-9]{5}[DFdf])$";
    NSPredicate *carNoValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [carNoValidate evaluateWithObject:aimStr];
}
身份证号验证
//18位的身份证号前十七位是本体码,最后一个是校验码(0-10),10用罗马数字x或X代替
//使用身份证的校验方法和校验码可以判定身份证的真假,校验方法如下:
//1.7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2这十七个系数分别和身份证号的前十七位数字相乘,然后将结果相加
//2.将上一步的计算结果除以11,求余数(0到10之间)
//3.上一步中的余数从0到10分别对应1-0-X-9-8-7-6-5-4-3-2,也就是身份证号的最后一位,如果不符合就是假的
- (BOOL)validatePersonalID:(NSString *)personID {
    NSString *aimStr = [personID stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *regex = @"^[1-6][0-7]0[0-9]{14}[0-9Xx]$";
    NSPredicate *personValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if (![personValidate evaluateWithObject:aimStr]) {
        return NO;
    } else {
        NSArray *modulusArr = @[@7,@9,@10,@5,@8,@4,@2,@1,@6,@3,@7,@9,@10,@5,@8,@4,@2];
        NSArray *referArr = @[@1,@0,@10,@9,@8,@7,@6,@5,@4,@3,@2];
        NSInteger sum = 0;
        for (int i = 0; i<aimStr.length-1; i++) {
            NSString *temp = [aimStr substringWithRange:NSMakeRange(i, 1)];
            sum += [temp intValue]*(int)modulusArr[i];
        }
        int remainder = sum % 11;
        int refer = (int)referArr[remainder];
        if ([[aimStr substringWithRange:NSMakeRange(personID.length-1, 1)] intValue] != refer) {
            return NO;
        }
        return YES;
    }
}
银行卡号验证
//国内的银行卡卡号基本上是16位或者19位,几乎所有的卡号都满足Luhn算法规则,所以银行卡的验证就不使用正则表达式了
//银行卡号编码规则及其应用https://zhuanlan.zhihu.com/p/21399490
//根据BIN码查银行卡种http://blog.csdn.net/archer119/article/details/52081046
- (BOOL)validateBankNo:(NSString *)bankNo {
    NSString *aimStr = [bankNo stringByReplacingOccurrencesOfString:@" " withString:@""];
    if (aimStr.length == 0) {
        return NO;
    } else {
        NSMutableArray *noArr = [NSMutableArray array];
        int sum = 0;
        for (NSInteger i = aimStr.length-1; i>=0; i--) {
            int tempNo = [[aimStr substringWithRange:NSMakeRange(i, 1)] intValue];
            if ((aimStr.length-i-1)%2 == 0) {
                [noArr addObject:@(tempNo)];
            } else {
                [noArr addObject:tempNo*2>9 ? @(tempNo*2-9) : @(tempNo*2)];
            }
        }
        for (NSNumber *number in noArr) {
            sum += (int)number;
        }
        return sum%10==0;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容