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)系作者
  • 序言:七十年代末忿磅,一起剝皮案震驚了整個(gè)濱河市糯彬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葱她,老刑警劉巖撩扒,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吨些,居然都是意外死亡搓谆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門豪墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泉手,“玉大人,你說我怎么就攤上這事偶器≌睹龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屏轰,是天一觀的道長(zhǎng)颊郎。 經(jīng)常有香客問我,道長(zhǎng)霎苗,這世上最難降的妖魔是什么姆吭? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮唁盏,結(jié)果婚禮上内狸,老公的妹妹穿的比我還像新娘。我一直安慰自己厘擂,他們只是感情好答倡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驴党,像睡著了一般瘪撇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上港庄,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天倔既,我揣著相機(jī)與錄音,去河邊找鬼鹏氧。 笑死渤涌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的把还。 我是一名探鬼主播实蓬,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茸俭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了安皱?” 一聲冷哼從身側(cè)響起调鬓,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酌伊,沒想到半個(gè)月后腾窝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡居砖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年虹脯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏候。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡循集,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔗草,到底是詐尸還是另有隱情暇榴,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布蕉世,位于F島的核電站蔼紧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狠轻。R本人自食惡果不足惜奸例,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望向楼。 院中可真熱鬧查吊,春花似錦、人聲如沸湖蜕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昭抒。三九已至评也,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灭返,已是汗流浹背盗迟。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熙含,地道東北人罚缕。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怎静,于是被迫代替她去往敵國(guó)和親邮弹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黔衡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容