美文网首页iOS框架 底层 技巧ios相关点
邮箱,手机号,身份证,银行卡有效性检测(正则表达式)

邮箱,手机号,身份证,银行卡有效性检测(正则表达式)

作者: 江湖闹士 | 来源:发表于2017-07-11 10:46 被阅读59次

    1、邮箱

    //邮箱
    - (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];
    }
    

    2、手机号

    ///// 手机号码的有效性判断
    //检测是否是固话
    - (BOOL)isFaxNumber
    {
        /**
         * 手机号码
         * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
         * 联通:130,131,132,152,155,156,185,186
         * 电信:133,1349,153,180,189
         */
        //    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
        /**
         10         * 中国移动:China Mobile
         11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
         12         */
        //    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
        /**
         15         * 中国联通:China Unicom
         16         * 130,131,132,152,155,156,185,186
         17         */
        //    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
        /**
         20         * 中国电信:China Telecom
         21         * 133,1349,153,180,189
         22         */
        NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
        /**
         25         * 大陆地区固话及小灵通
         26         * 区号:010,020,021,022,023,024,025,027,028,029
         27         * 号码:七位或八位
         28         */
        // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
        
        //    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];
        
        //    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        //        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        //        || ([regextestct evaluateWithObject:mobileNum] == YES)
        //        || ([regextestcu evaluateWithObject:mobileNum] == YES))
        if ([regextestct evaluateWithObject: self] == YES)
        {
            return YES;
        }
        else
        {
            return NO;
        }
    }
    
    
    
    ///// 手机号码的有效性判断
    - (BOOL)isMobileNumber
    {
        /**
         * 手机号码
         * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
         * 联通:130,131,132,152,155,156,185,186
         * 电信:133,1349,153,180,189
         */
        NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
        /**
         10         * 中国移动:China Mobile
         11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
         12         */
        NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
        /**
         15         * 中国联通:China Unicom
         16         * 130,131,132,152,155,156,185,186
         17         */
        NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
        /**
         20         * 中国电信:China Telecom
         21         * 133,1349,153,180,189
         22         */
        //    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
        /**
         25         * 大陆地区固话及小灵通
         26         * 区号:010,020,021,022,023,024,025,027,028,029
         27         * 号码:七位或八位
         28         */
        // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
        
        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];
        
        if (([regextestmobile evaluateWithObject:self] == YES)
            || ([regextestcm evaluateWithObject:self] == YES)
            //        || ([regextestct evaluateWithObject:mobileNum] == YES)
            || ([regextestcu evaluateWithObject:self] == YES))
        {
            return YES;
        }
        else
        {
            return NO;
        }
    }
    

    3、身份证

    //判断身份证号码
    - (BOOL) isIdCardNo{
        BOOL flag;
        if (self.length <= 0)
        {
            flag = NO;
            return flag;
        }
        
        NSString *regex2 = @"^(^[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 *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
        flag = [identityCardPredicate evaluateWithObject:self];
        
        
        //如果通过该验证,说明身份证格式正确,但准确性还需计算
        if(flag)
        {
            if(self.length==18)
            {
                //将前17位加权因子保存在数组里
                NSArray * idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
                
                //这是除以11后,可能产生的11位余数、验证码,也保存成数组
                NSArray * idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
                
                //用来保存前17位各自乖以加权因子后的总和
                
                NSInteger idCardWiSum = 0;
                for(int i = 0;i < 17;i++)
                {
                    NSInteger subStrIndex = [[self substringWithRange:NSMakeRange(i, 1)] integerValue];
                    NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
                    
                    idCardWiSum+= subStrIndex * idCardWiIndex;
                    
                }
                
                //计算出校验码所在数组的位置
                NSInteger idCardMod=idCardWiSum%11;
                
                //得到最后一位身份证号码
                NSString * idCardLast= [self substringWithRange:NSMakeRange(17, 1)];
                
                //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
                if(idCardMod==2)
                {
                    if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"])
                    {
                        return flag;
                    }else
                    {
                        flag =  NO;
                        return flag;
                    }
                }else
                {
                    //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
                    if([idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]])
                    {
                        return flag;
                    }
                    else
                    {
                        flag =  NO;
                        return flag;
                    }
                }
            }
            else
            {
                flag =  NO;
                return flag;
            }
        }
        else
        {
            return flag;
        }
    }
    

    4、银行卡

    //验证银行卡号有效性
    - (BOOL)isBankAccount{
        int oddsum = 0;     //奇数求和
        int evensum = 0;    //偶数求和
        int allsum = 0;
        int cardNoLength = (int)[self length];
        int lastNum = [[self substringFromIndex:cardNoLength-1] intValue];
        
        NSString *cardNo = [self substringToIndex:cardNoLength - 1];
        for (int i = cardNoLength -1 ; i>=1;i--) {
            NSString *tmpString = [cardNo substringWithRange:NSMakeRange(i-1, 1)];
            int tmpVal = [tmpString intValue];
            if (cardNoLength % 2 ==1 ) {
                if((i % 2) == 0){
                    tmpVal *= 2;
                    if(tmpVal>=10)
                        tmpVal -= 9;
                    evensum += tmpVal;
                }else{
                    oddsum += tmpVal;
                }
            }else{
                if((i % 2) == 1){
                    tmpVal *= 2;
                    if(tmpVal>=10)
                        tmpVal -= 9;
                    evensum += tmpVal;
                }else{
                    oddsum += tmpVal;
                }
            }
        }
        
        allsum = oddsum + evensum;
        allsum += lastNum;
        if((allsum % 10) == 0)
            return YES;
        else
            return NO;
    }
    

    相关文章

      网友评论

        本文标题:邮箱,手机号,身份证,银行卡有效性检测(正则表达式)

        本文链接:https://www.haomeiwen.com/subject/ipbphxtx.html