OC 正則表達(dá)式的語法及使用

正則表達(dá)式就是可以分段進(jìn)行匹配的語法規(guī)則,判斷字符串中的每一個(gè)片段是否能夠相應(yīng)的內(nèi)容規(guī)則匹配。
基本語法:

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

2.元字符,特殊字符,不是匹配的字符字面量。
. ????????表示除換行符以外的任意字符;
*????????表示它前面的那個(gè)表達(dá)式重復(fù)0次或若干次;
??????????eg:“ab*”表示“a”或“ab”或“abb”…
+????????表示它前面的那個(gè)表達(dá)式重復(fù)至少1次;
??????????eg:“ab+”表示“ab”或“abb”或“abbb”…
?????????表示它前面的那個(gè)表達(dá)式存在或不存在;
??????????eg:“ab?”表示“a”或“ab”
^????????表示以它后面的表達(dá)式開頭的字符串;
??????????eg:“^abc”表示以“abc”開頭的字符串
$????????表示以它前面的表達(dá)式結(jié)尾的字符串;
??????????eg:“abc$”表示以“abc”結(jié)尾的字符串
[ ]???????表示內(nèi)容的范圍;
??????????eg:“[a-zA-Z]”表示任一字母;“[ab]”表示“a”或“b”
{}???????表示數(shù)量的范圍;
???????????eg:“{2}”表示2個(gè);“{2,5}”表示2個(gè)到5個(gè);“{3,}”表示至少3個(gè);
|?????????表示 或;
??????????eg:“a|b”表示“a”或“b”
\num? num為一個(gè)整數(shù),表示前面的表達(dá)式復(fù)制num次;
??????????eg:“(ab)\3”表示“ababab”
\b ??????表示單詞的開始或結(jié)束;
\d ??????表示數(shù)字,相當(dāng)于“[0-9]”;
\s ????? 表示任意空白符;
\w ?????表示任意字符數(shù)字或下劃線或漢字,相當(dāng)于“[a-zA-Z0-9\u4E00-\u9FFF_]”

3.字符轉(zhuǎn)義
\ ???????表示字符轉(zhuǎn)義,如果我們要使用元字符的字面意思的話,就需要轉(zhuǎn)義字符進(jìn)
?????????行字符轉(zhuǎn)義。
?????????eg:“\.”表示“.”;“\*”表示“*”;“\\”表示“\”;

4.反義字符
\W ???? 表示不是字符數(shù)字下劃線或者漢字的字符;
\S ????? 表示任意不是空白符的字符;
\D ??????表示不是數(shù)字的字符;
\B???? ??表示不是單詞開頭或結(jié)束的位置;
[^x]???? 表示除“x”外的任意字符;
[^abc]?表示除“a”“b”“c”外的任意字符;

OC中正則表達(dá)式的寫法又有些微的不同,使用轉(zhuǎn)義字符作用在元字符(. $ | ( ) [ { ^ ? * + \)上的時(shí)候要在轉(zhuǎn)義字符前再加“\”。eg:正常規(guī)則下,“.”表示換行符以外的任意字符,“\.”表示“.”;在OC中,“.”依然表示換行符以外的任意字符,“\\.”表示“.”。簡(jiǎn)單點(diǎn)理解就是按正常的規(guī)則先寫表達(dá)式,然后把寫好的表達(dá)式中的所有“\”都替換為“\\”即可。

更多正則表達(dá)式的語法可參考http://deerchao.net/tutorials/regex/regex.htm

幾個(gè)實(shí)例:

郵箱格式驗(yàn)證:
- (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];
}
手機(jī)號(hào)碼驗(yàn)證
//聯(lián)通號(hào)段:130 131 132 145 146 155 156 166 171 175 176 185 186
//移動(dòng)號(hào)段:134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
//電信號(hào)段: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;
}
車牌號(hào)驗(yàn)證
//除了原有的五位車牌號(hào)之外,增加兩種新能源汽車車牌號(hào),小型家庭用車:在城市碼之后加D或F,再加五位編碼;大型汽車:城市碼之后是五位編碼,再加D或F;D和F分別表示純電動(dòng)車和混合動(dòng)力汽車。
- (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];
}
身份證號(hào)驗(yàn)證
//18位的身份證號(hào)前十七位是本體碼,最后一個(gè)是校驗(yàn)碼(0-10),10用羅馬數(shù)字x或X代替
//使用身份證的校驗(yàn)方法和校驗(yàn)碼可以判定身份證的真假,校驗(yàn)方法如下:
//1.7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2這十七個(gè)系數(shù)分別和身份證號(hào)的前十七位數(shù)字相乘,然后將結(jié)果相加
//2.將上一步的計(jì)算結(jié)果除以11,求余數(shù)(0到10之間)
//3.上一步中的余數(shù)從0到10分別對(duì)應(yīng)1-0-X-9-8-7-6-5-4-3-2,也就是身份證號(hào)的最后一位,如果不符合就是假的
- (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;
    }
}
銀行卡號(hào)驗(yàn)證
//國(guó)內(nèi)的銀行卡卡號(hào)基本上是16位或者19位,幾乎所有的卡號(hào)都滿足Luhn算法規(guī)則,所以銀行卡的驗(yàn)證就不使用正則表達(dá)式了
//銀行卡號(hào)編碼規(guī)則及其應(yīng)用https://zhuanlan.zhihu.com/p/21399490
//根據(jù)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;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容