1 using System; 2 using System.Text.RegularExpressions; 3 4 namespace com.hooPony.utils.utils 5 { 6 /// <summary> 7 /// 中国居民身份证工具类 8 /// <code>@author hooPony</code> 9 /// 前6位是地址码,表示登记户口时所在地的行政区划代码,依照《*行政区划代码》国家标准(GB/T2260)的规定执行。 10 /// 7到14位是出生年月日,采用YYYYMMDD格式。 11 /// 15到17位是顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编订的顺序号,顺序码的奇数分配给男性,偶数分配给女性,即第17位奇数表示男性,偶数表示女性。 12 /// 第18位是校验码,采用ISO 7064:1983, MOD 11-2校验字符系统。 13 /// </summary> 14 public class IDCard 15 { 16 /// <summary> 17 /// 加权因子 18 /// </summary> 19 private static int[] MOD = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 20 21 /// <summary> 22 /// 校验码 23 /// </summary> 24 private static char[] VERCODE = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; 25 26 /// <summary> 27 /// 验证身份证是否符合国家标准,地址码可能不准确 28 /// </summary> 29 /// <param name="idcard">身份证号</param> 30 /// <returns></returns> 31 public static bool verify(string idcard) 32 { 33 if (idcard == null || idcard.Length != 18) 34 { 35 return false; 36 } 37 string regex = "^(1[1-5]{1}|2[1-3]{1}|3[1-7]{1}|4[1-6]{1}|5[0-4]{1}|6[1-5]{1}){1}(([0-7]{1}[0-9]{1}|90){1}[0-9]{1}[0-9]{1}(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)){1}([0-9]{1}[0-9]{1}[0-9]{1}([0-9]{1}|x|X){1}){1}$"; 38 bool res = Regex.IsMatch( idcard, regex); 39 if (!res) 40 { 41 return false; 42 } 43 // 检验校验码 44 char[] chars = idcard.ToCharArray(); 45 int sum = 0; 46 try 47 { 48 for (int i = 0; i < MOD.Length; i++) 49 { 50 sum += int.Parse(chars[i].ToString()) * MOD[i]; 51 } 52 } 53 catch (Exception e) 54 { 55 return false; 56 } 57 if (chars[chars.Length - 1] != VERCODE[sum % 11]) 58 { 59 return false; 60 } 61 return true; 62 } 63 } 64 }