C#使用正则表达式验证身份证不简单

用C#代码验证身份证不是很简单吗?使用正则表达式就可以很简单地完成啊?它共18位,前17位为数字,最后1位是数字或X字母,其中年月日部分也可以进行验证。如果单纯使用上面步骤来验证是不正确的,一个身份证号码是有规则的,而不是简单的安装数字的组合,尤其是最后一位,最后一位是做啥的呢?它是用来校验身份证是否有效,是身份证合规的关键,这就说的不简单也是最后一位不简单。面试题也是某些企业常考到的问题之一。本文将介绍如何用C#代码校验身份证。.

身份证组成部分

1、前2位省级行政区域码,第一位是大区编码,全国共8个大区。

2、第3-4位数字为地级行政区编码

3、第5-6位数字为县级行政区编码

4、第7-14位为生日码,就是你的出生日期

5、第15-17位为顺序码,表示在同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。

6、第18位为校验码,是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。其中X代表计算出来的10。

身份证最后一位规则

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少。

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。

例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是符合计算规则的身份证。

首先我们得出前17位的乘积和【5×7+3×9+0×10+1×5+0×8+2×4+1×2+9×1+2×6+0×3+0×7+5×9+0×10+8×5+0×8+1×4+1×2】是189,然后用189除以11得出的结果是189÷11=17余下2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。(来源:百度百科)

代码实现

    验证身份证最后一位麻烦点,其他的好说,最后一位需要计算出来验证。代码如下:

 static string TestCardId(string cardId)        {            string pattern = @"^\d{17}(?:\d|X)$";            string birth = cardId.Substring(6, 8).Insert(6, "-").Insert(4, "-");            DateTime time = new DateTime();            // 加权数组,用于验证最后一位的校验数字            int[] arr_weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };            // 最后一位计算出来的校验数组,如果不等于这些数字将不正确            string[] id_last = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };               int sum = 0;            //通过循环前16位计算出最后一位的数字            for (int i = 0; i < 17; i++)            {                sum += arr_weight[i] * int.Parse(cardId[i].ToString());            }             // 实际校验位的值            int result = sum % 11;             // 首先18位格式检查            if (Regex.IsMatch(cardId, pattern))            {   // 出生日期检查                if (DateTime.TryParse(birth, out time))                          {                    // 校验位检查                    if (id_last[result] == cardId[17].ToString())                      {                        return "身份证验证成功!";                    }                    else                    {                        return  "身份证最后一位校验错误!";                    }                }                else                {                    return "出生日期验证失败!";                }            }            else            {                return "身份证号格式错误!";            }        }//调用var rel=  TestCardId("11019819860908662X"); Console.WriteLine(rel);

 验证结果:

C#使用正则表达式验证身份证不简单

下面输入一个正确的身份证

var rel=  TestCardId("330501198709162223");Console.WriteLine(rel);//证件来源网络,仅供测试用,请勿传播

验证结果:

C#使用正则表达式验证身份证不简单

结语

本文讲述了使用正则表达式验证身份证号码,其实最关键的代码不是用正则的,而是计算出来的。原来以为按照数字规则就可以,没有想到身份证的验证还有校验码一说,从这方面来说,身份证验证不简单。另外注意面试有可能考到。希望本文对您有所帮助,同时欢迎留言讨论。