OC 正規表示式的語法及使用

weixin_33895657發表於2017-12-22

正規表示式就是可以分段進行匹配的語法規則,判斷字串中的每一個片段是否能夠相應的內容規則匹配。
基本語法:

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;
    }
}

相關文章