正則表達(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;
}
}