在項(xiàng)目中有很多情況會(huì)碰到各種的驗(yàn)證判斷,如電話、郵箱、身份證。
分享幾個(gè)常用的正則表達(dá)式,親測(cè) 有效。
驗(yàn)證是否為電話號(hào)碼
- (BOOL)isPhoneNumber {
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
BOOL res1 = [regextestmobile evaluateWithObject:self];
BOOL res2 = [regextestcm evaluateWithObject:self];
BOOL res3 = [regextestcu evaluateWithObject:self];
BOOL res4 = [regextestct evaluateWithObject:self];
return (res1 || res2 || res3 || res4);
}
驗(yàn)證是否為郵箱地址
- (BOOL)isEmail {
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:self];
}
驗(yàn)證是否為身份證號(hào)碼
- (BOOL)isIDCard{
NSString *identityString = self;
if (identityString.length != 18) return NO;
// 正則表達(dá)式判斷基本 身份證號(hào)是否滿足格式
NSString *regex = @"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$";
// NSString *regex = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
NSPredicate *identityStringPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
//如果通過該驗(yàn)證,說明身份證格式正確,但準(zhǔn)確性還需計(jì)算
if(![identityStringPredicate evaluateWithObject:identityString]) return NO;
//** 開始進(jìn)行校驗(yàn) *//
//將前17位加權(quán)因子保存在數(shù)組里
NSArray *idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
//這是除以11后,可能產(chǎn)生的11位余數(shù)、驗(yàn)證碼,也保存成數(shù)組
NSArray *idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
//用來保存前17位各自乖以加權(quán)因子后的總和
NSInteger idCardWiSum = 0;
for(int i = 0;i < 17;i++) {
NSInteger subStrIndex = [[identityString substringWithRange:NSMakeRange(i, 1)] integerValue];
NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
idCardWiSum+= subStrIndex * idCardWiIndex;
}
//計(jì)算出校驗(yàn)碼所在數(shù)組的位置
NSInteger idCardMod=idCardWiSum%11;
//得到最后一位身份證號(hào)碼
NSString *idCardLast= [identityString substringWithRange:NSMakeRange(17, 1)];
//如果等于2,則說明校驗(yàn)碼是10,身份證號(hào)碼最后一位應(yīng)該是X
if(idCardMod==2) {
if(![idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]) {
return NO;
}
}
else{
//用計(jì)算出的驗(yàn)證碼與最后一位身份證號(hào)碼匹配,如果一致,說明通過,否則是無效的身份證號(hào)碼
if(![idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]) {
return NO;
}
}
return YES;
}
驗(yàn)證是否為純漢字
- (BOOL)isValidChinese {
NSString *chineseRegex = @"^[\\u4e00-\\u9fa5]+$";
return [self isValidateByRegex:chineseRegex];
}
驗(yàn)證是否為郵政編碼
- (BOOL)isValidPostalcode {
NSString *postalRegex = @"^[0-8]\\\\d{5}(?!\\\\d)$";
return [self isValidateByRegex:postalRegex];
}