【C#】身份证号正确性验证及正则表达式格式验证

身份证前两位各省对应的编号是:

1、华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15;

2、东北地区: 辽宁省|21,吉林省|22,黑龙江省|23;

3、华东地区: 上海市|31,江苏省|32,浙江省|33,安徽省|34,福建省|35,江西省|36,山东省|37;

4、华中地区: 河南省|41,湖北省|42,湖南省|43;

5、华南地区:广东省|44,广西壮族自治区|45,海南省|46;

6、西南地区: 四川省|51,贵州省|52,云南省|53,西藏自治区|54,重庆市|50;

7、西北地区: 陕西省|61,甘肃省|62,青海省|63,宁夏回族自治区|64,新疆维吾尔自治区|65;

8、特别地区:台湾地区(886)|83,香港特别行政区(852)|81,澳门特别行政区(853)|82。

省市区编码下载:

链接:https://pan.baidu.com/s/1CwGJnK0QmJidLyHY7536gw
提取码:q11r

C#算法验证正确性

using System;

namespace ConnUtils
{
    /**************************************************************************************/
    /************************************身份证号码的验证*************************************/
    /**************************************************************************************/

    /**
    * 身份证15位编码规则:dddddd yymmdd xx p
    * dddddd:地区码
    * yymmdd: 出生年月日
    * xx: 顺序类编码,无法确定
    * p: 性别,奇数为男,偶数为女
    * <p />
    * 身份证18位编码规则:dddddd yyyymmdd xxx y
    * dddddd:地区码
    * yyyymmdd: 出生年月日
    * xxx:顺序类编码,无法确定,奇数为男,偶数为女
    * y: 校验码,该位数值可通过前17位计算获得
    * <p />
    * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
    * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
    * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
    * i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
    **/
    public class IdentityCardValidation
    {
        /// <summary>
        /// 验证身份证合理性
        /// </summary>
        /// <param name="idNumber">身份证号</param>
        /// <returns></returns>
        public static bool CheckIdCard(string idNumber)
        {
            if (idNumber.Length == 18)
            {
                var check = CheckIdCard18(idNumber);
                return check;
            }
            if (idNumber.Length != 15) return false;
            {
                var check = CheckIdCard15(idNumber);
                return check;
            }
        }

        /// <summary>
        /// 18位身份证号码验证
        /// </summary>
        private static bool CheckIdCard18(string idNumber)
        {
            if (long.TryParse(idNumber.Remove(17), out var n) == false
                || n < Math.Pow(10, 16)
                || long.TryParse(idNumber.Replace(‘x‘, ‘0‘).Replace(‘X‘, ‘0‘), out n) == false)
            {
                return false;//数字验证
            }
            //省份编号
            const string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if (address.IndexOf(idNumber.Remove(2), StringComparison.Ordinal) == -1)
            {
                return false;//省份验证
            }
            var birth = idNumber.Substring(6, 8).Insert(6, "-").Insert(4, "-");
            if (DateTime.TryParse(birth, out _) == false)
            {
                return false;//生日验证
            }
            string[] arrArrifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(‘,‘);
            string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(‘,‘);
            char[] Ai = idNumber.Remove(17).ToCharArray();
            int sum = 0;
            for (int i = 0; i < 17; i++)
            {
                // 加权求和
                sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
            }
            //得到验证码所在位置
            Math.DivRem(sum, 11, out var y);
            var x = idNumber.Substring(17, 1).ToLower();
            var yy = arrArrifyCode[y];
            if (arrArrifyCode[y] != idNumber.Substring(17, 1).ToLower())
            {
                return false;//校验码验证
            }
            return true;//符合GB11643-1999标准
        }

        /// <summary>
        /// 15位身份证号码验证
        /// </summary>
        private static bool CheckIdCard15(string idNumber)
        {
            long n = 0;
            if (long.TryParse(idNumber, out n) == false || n < Math.Pow(10, 14))
            {
                return false;//数字验证
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if (address.IndexOf(idNumber.Remove(2)) == -1)
            {
                return false;//省份验证
            }
            string birth = idNumber.Substring(6, 6).Insert(4, "-").Insert(2, "-");
            DateTime time = new DateTime();
            if (DateTime.TryParse(birth, out time) == false)
            {
                return false;//生日验证
            }
            return true;
        }
    }
}

正则验证格式

https://www.jb51.net/article/109384.htm

十八位: ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$

十五位: ^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$

在线正则表达式测试

https://tool.oschina.net/regex

正则表达式可视化

https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24

原文地址:https://www.cnblogs.com/chuankang/p/11888104.html

时间: 2024-11-02 22:24:19

【C#】身份证号正确性验证及正则表达式格式验证的相关文章

C# 各种输入格式验证#各种输入格式验证

/// <summary> /// 各种输入格式验证 /// </summary> public class ValidateUtil { private static Regex RegNumber = new Regex("^[0-9]+$"); private static Regex RegNumberSign = new Regex("^[+-]?[0-9]+$"); private static Regex RegDecimal

vue-cli脚手架构建了项目如何去除Eslint验证(语法格式验证)

1.创建工程的时候,提示是否启用eslint检测的. Use ESLint to lint your code? No 2.在webpack.base.conf.js里面删掉下面: { test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-form

比较规范的身份证号验证正则表达式

一些要求用户信息比较严格的地方比如用户注册.登录的时候都需要验证用户的身份证是否合法,而通过这些验证能大大的过滤掉很多水客,给你的系统带来非常精准的用户信息. 很多时候我们都是通过一组正则表达式来判断用户输入的身份证是否合法,那在用正则表达式判断之前,你对身份证号的组成有多少了解呢?下面来说说一个身份证号里面包含了多少的信息: 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.

Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

最近项目中新增的功能,需要对手机号.姓名.身份证号等一些信息进行验证,最好的方法是通过正则表达式来验证,网上查了一些资料,写了这几个工具方法. 1.验证手机号 规则:第一位只能是1,第二位为3-8中的数字,3-11位为任意的数字 /** * 手机号号段校验, 第1位:1: 第2位:{3.4.5.6.7.8}任意数字: 第3-11位:0-9任意数字 * @param value * @return */ public static boolean isTelPhoneNumber(String v

C# 中使用正则表达式验证电话号码、手机号、身份证号

验证电话号码的主要代码如下: public bool IsTelephone(stringstr_telephone) { returnSystem.Text.RegularExpressions.Regex.IsMatch(str_telephone,@"^(\d{3,4}-)?\d{6,8}$"); } 验证手机号码的主要代码如下: public bool IsHandset(string str_handset) { returnSystem.Text.RegularExpres

身份证号验证正则表达式,支持打码

现在身份证号打码比较多,很多伸手党找不到类似的正则表达式,这里贴出来. 这里只考虑18位,打码位置为月份和日期,3301841985****411x,类似这种 ^(\d{10})((\*{4})|(\d{4}))(\d{3})([0-9]|X|x)$ 如果打码位置有变化自行调整即可. 勿喷.

C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编

验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressions.Regex.IsMatch(str_telephone, @"^(\d{3,4}-)?\d{6,8}$"); } 验证手机号码的主要代码如下: public bool IsHandset(string str_handset) { return System.Text.RegularEx

js实现完美身份证号有效性验证

最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个,代码还是用自己的舒服哈 已实现功能:支持15位和18位身份证号,支持地址编码.出生日期.校验位验证 代码如下: /*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字

锋利的js之验证身份证号

我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构  公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.  2.地址码  表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行.  3.出生日期码  表示编码对象出生的年.月