【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 == )
{
var check = CheckIdCard18(idNumber);
return check;
}
if (idNumber.Length != ) return false;
{
var check = CheckIdCard15(idNumber);
return check;
}
} /// <summary>
/// 18位身份证号码验证
/// </summary>
private static bool CheckIdCard18(string idNumber)
{
if (long.TryParse(idNumber.Remove(), out var n) == false
|| n < Math.Pow(, )
|| long.TryParse(idNumber.Replace('x', '').Replace('X', ''), out n) == false)
{
return false;//数字验证
}
//省份编号
const string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove(), StringComparison.Ordinal) == -)
{
return false;//省份验证
}
var birth = idNumber.Substring(, ).Insert(, "-").Insert(, "-");
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().ToCharArray();
int sum = ;
for (int i = ; i < ; i++)
{
// 加权求和
sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
}
//得到验证码所在位置
Math.DivRem(sum, , out var y);
var x = idNumber.Substring(, ).ToLower();
var yy = arrArrifyCode[y];
if (arrArrifyCode[y] != idNumber.Substring(, ).ToLower())
{
return false;//校验码验证
}
return true;//符合GB11643-1999标准
} /// <summary>
/// 15位身份证号码验证
/// </summary>
private static bool CheckIdCard15(string idNumber)
{
long n = ;
if (long.TryParse(idNumber, out n) == false || n < Math.Pow(, ))
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove()) == -)
{
return false;//省份验证
}
string birth = idNumber.Substring(, ).Insert(, "-").Insert(, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
return true;
}
}
}
正则验证格式
https://www.jb51.net/article/109384.htm
十八位: ^[-]\d{}(||([]\d))\d{}(([-])|(||))(([-][-])||||)\d{}[-9Xx]$
十五位: ^[-]\d{}\d{}(([-])|(||))(([-][-])||||)\d{}$
在线正则表达式测试
https://tool.oschina.net/regex
正则表达式可视化
https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24
【C#】身份证号正确性验证及正则表达式格式验证的更多相关文章
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...
- JS常见的表单验证,H5自带的验证和正则表达式的验证
H5验证 自带的验证无法满足需求: <form action="" method="get"> name:<input type=" ...
- C# 各种输入格式验证#各种输入格式验证
/// <summary> /// 各种输入格式验证 /// </summary> public class ValidateUtil { private static Reg ...
- vue-cli脚手架构建了项目如何去除Eslint验证(语法格式验证)
Eslint是一个语法检查工具,但是限制很严格,在vue文件里面很多空格都会导致红线,取消的方式如下: 1.创建工程的时候,提示是否启用eslint检测的. Use ESLint to lint yo ...
- mysql从身份证号中提取生日、性别
SELECT p.ID, p.IDCardNo, IF ( LENGTH(p.IDCardNo) , CAST( , ) AS DATETIME ), CAST( CONCAT( ', , ) ) A ...
- [前端] jquery验证手机号、身份证号、中文名称
验证: 中文姓名.手机号.身份证和地址 HTML(表单): <form action=""> <div class="form-group"& ...
- ASP.NET MVC4中的Model验证 移除指定验证信息
MVC中通过Model在页面间传值使的程序开发变得更加的快捷,但是很多时候,我们在数据传递的时候为了确保数据的有效性,要对Model的相关属性做基本的数据验证. 不多说直接上个代码,Model的实体类 ...
- iOS常用正则表达式验证(手机号、密码格式、身份证号等)
#import @interfaceUtils : NSObject #pragma 正则匹配手机号 + (BOOL)checkTelNumber:(NSString*) telNumber; #pr ...
- js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr)
js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr) 一.总结 1.|符号的使用:var reg=/^\d ...
随机推荐
- Windows 有没有办法查看文件被哪个进程占用
经常当我们删除文件时,有时会提示[操作无法完成,因为文件已在另一个程序中打开,请关闭该文件并重试],到底是哪些程序呢? 有时候一个一个找真不是办法,已经被这个问题折磨很久了,今天下决心要把它解决,找到 ...
- .tar.gz 文件和 .tar.xz 文件的区别
tar.gz and tar.xz both are compressed tar-files, but with different compression methods. tar.gz is c ...
- grafana的用户及权限的配置
一.概述 在上几篇文章中,已经在grafana中,配置了几个Dashboard.需要给开发人员查看,但是我又不想让开发人员,随便更改Dashboard中的配置.需要创建一个只读账号才行. 二.添加用户 ...
- 【mybatis】标签条件中判断入参属性值是否包含子字符串
可以直接使用 contains判断 <foreach collection="list" item="item" index="index&qu ...
- C# vb .NET读取多个识别条形码线性条码
有时候,我们不确定数据源图片中到底有多少个条码,这些条码有可能是同一个类型的,也可能是不同类型的,如何在C#,vb等.NET平台语言里实现快速准确读取呢?答案是使用SharpBarcode! Shar ...
- Redis主从复制看这篇就够了
一.概念和作用 概念:主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 作用: 读写分离: 容灾恢复: 二.复制原理 slav ...
- G++命令
gcc and g++分别是gnu的c & c++编译器. 从源代码到可执行文件的四步 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件,用到预处理器cpp.这一步 ...
- ES6迭代器
说起迭代器, 那就要先了解迭代模式 迭代模式: 提供一种方法可以顺序获得聚合对象中的各个元素, 是一种最简单, 也是最常见的设计模式,它可以让用户通过特定的接口寻访集合中的每一个元素 而不用了解底层的 ...
- 37.前台js登陆加密分析
开篇 由于现在的登陆接口如果明文传输的话,容易被暴力破解,越来越多的网站选择了前台js加密的方式,像这样: 或者这样: 枯了,对渗透造成一定的影响 本篇文章将系统的讲述使用Python对前台js加密爆 ...
- 开机注册联通2G网络
2/3G PLMN LIST 在MM_RATCM_PLMN_LIST_CNF或NWSEL_MM_PLMN_SEARCH_CNF消息中可以查看2,3G搜到的PLMN LIST 内容如下: RAT:Rad ...