原文地址:http://www.cnblogs.com/zhongshengzhen/

java对身份证验证及正则表达式解析

package service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import org.junit.Test; public class TestRegex {
public static boolean isChineseName(String realname){
return Pattern.matches("[\u4e00-\u9fa5|·]{2,15}",realname);
}
public static boolean isCardId(String cardid){
return Pattern.matches("^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", cardid);
}
public static String[] randomArray(int length){
int index = 0;
String temp = ",";
for(int ii=0;ii<1000;ii++){
for(int i=0;i<length;i++){
index = (int) (Math.random()*10);
temp += ( index + "");
}
temp +=",";
}
return temp.split(",");
}
//身份证前1位每位加权因子
private static int[] power = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//身份证第18位校检码
private static String[] refNumber ={"1", "0", "X", "9", "8", "7", "6", "5", "4", "3"};
//省(直辖市)代码表
private String provinceCode[] = { "11", "12", "13", "14", "15", "21", "22",
"23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
"44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63",
"64", "65", "71", "81", "82", "91" };
/**
* 检查身份证的省份信息是否正确(使用与18/15位身份证)
* @param provinceid
* @return
*/
public boolean checkProvinceId(String provinceid){
for (String id : provinceCode) {
if (id.equals(provinceid)) {
return true;
}
}
return false;
}
/**
* 校验身份证第18位是否正确(只适合18位身份证)
* @param cardId
* @return
*/
public static boolean checkCardIdLastNum(String cardId){
if(cardId.length() != 18){
return false;
}
char[] tmp = cardId.toCharArray();
int[] cardidArray = new int[tmp.length-1];
int i=0;
for(i=0;i<tmp.length-1;i++){
cardidArray[i] = Integer.parseInt(tmp[i]+"");
}
String checkCode = sumPower(cardidArray);
String lastNum = tmp[tmp.length-1] + "";
if(lastNum.equals("x")){
lastNum = lastNum.toUpperCase();
}
if(!checkCode.equals(lastNum)){
return false;
}
return true;
}
/**
* 计算身份证的第十八位校验码
* @param cardidArray
* @return
*/
public static String sumPower(int[] cardidArray){
int result = 0;
for(int i=0;i<power.length;i++){
result += power[i] * cardidArray[i];
}
return refNumber[(result%11)];
}
/**
* 判断日期是否有效
* @param inDate
* @return
*/
public boolean isValidDate(String inDate) {
if (inDate == null){
return false;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
if (inDate.trim().length() != dateFormat.toPattern().length()){
return false;
}
dateFormat.setLenient(false);//严格的日期匹配
try {
dateFormat.parse(inDate.trim());
} catch (ParseException e) {
return false;
}
return true;
}
//@Test
public void testName(){
String[] array = {"钟·","在哪"};
for(int i=0;i<array.length;i++){
System.out.println(array[i]+":"+isChineseName(array[i]));
}
}
//
//@Test
public void testCardId(){
String[] array = randomArray(18);
int index = 0,sum =0;
for(int i=0;i<array.length;i++){
sum += 1;
if(isCardId(array[i])){
index += 1;
}
System.out.println(array[i]+":"+isCardId(array[i]));
}
double ret = index/sum;
System.out.println(index+","+sum+","+ret);
}
//@Test
public void testArray(){
String[] array = randomArray(15);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
//@Test
public void testLastNum(){
String[] cardId = {"440982199563272359","43010219890414298x"};
for(int i=0;i<cardId.length;i++){
System.out.println(cardId[i]+":"+checkCardIdLastNum(cardId[i]));
}
}
//@Test
public void testProcince(){
String[] cardId = {"440982199563272359","43010219890414298x"};
for(int i=0;i<cardId.length;i++){
System.out.println(cardId[i].substring(0,2)+":"+checkProvinceId(cardId[i].substring(0,2)));
} }
@Test
public void testDate(){
//String[] cardId = {"440982199003272359","43010219890414298x"};
String cardId[] = {"445102198904312332",
"131100200102290696",
"51042119710630173X",
"340823196806263613",
"340703197410050615",
"440982195201230696",
"130203196110239132",
"321101197411218776",
"340501196812265178",
"330424197204277791",
"61040219710929439X",
"230826195610286476",
"350305196501252819",
"450881197212026374",
"220282197010121032",
"341723197209084377",
"451024197211265090",
"330727195609144416",
"411626197504219395",
"230605196203286219",
"21068119520426399X",
"511821195404264774",
"622923197107299798",
};
for(int i=0;i<cardId.length;i++){ System.out.println(cardId[i].substring(6,14)+":"+isValidDate(cardId[i].substring(6,14)));
}
}
}

java对身份证验证及正则表达式解析的更多相关文章

  1. js邮箱验证,身份证验证,正则表达式

    邮箱验证: html部分: 邮箱验证:<input type="text" id="mail" value="" / onkeyup= ...

  2. Java正则表达式实现港、澳、台身份证验证

    最近由于业务的要求,需要进行港.澳.台人员身份证验证,现在直接上代码,经供参考学习,也为自己积累一些工具类: package com.qiu.validate; public class regexV ...

  3. java身份证验证

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  4. 身份证号码的正则表达式及验证详解(JavaScript,Regex)

    简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是&q ...

  5. Java国际化号码验证方法,国内手机号正则表达式

    Java国际化号码验证方法,国内手机号正则表达式 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.1 ...

  6. 【Java】身份证号码验证

    代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...

  7. Java实现身份证号码验证源码分享

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  8. Java基础之身份证验证

    //简约版package test; import java.util.Scanner; public class ID { /** * 匹配算法 : 1) 得到17位身份证号码与下面给出的17位 2 ...

  9. inform表单验证,正则表达式,用户名,身份证,密码,验证码

    最近利用空闲时间写了部分表单验证,包括用户名,身份证,密码,验证码,仅为自己巩固最近所学的知识 表单的样式使用的是table布局,因为觉得DIV布局定位比较麻烦,table有三列,分别为基本信息,输入 ...

随机推荐

  1. *IntelliJ IDEA使用Hibernate连接数据库

    在IntelliJ IDEA中配置MySQL Database.

  2. Android开发之读写联系人

    读写联系人需要用到android的ContentProvider 同时需要读和写联系人的权限 需要使用到联系人数据库中的 * raw_contacts表: * contact_id:联系人id * d ...

  3. 解决ImportError: cannot import name HTTPConnection的方法

    在写python程序的时候,使用from httplib import HTTPConnection,在run的时候提示ImportError: cannot import name HTTPConn ...

  4. 设计模式 - command

    将请求封装为对象,从而可以使用不同的请求对客户进行参数化,该模式的关键在于对不同请求的封装.简单的说,也就是在请求发出者和客户间通过command对象进行解耦,从而使得请求者可以通过实例化不同的com ...

  5. WindowsPhone8SDK重装后设计器加载异常的处理办法

    Close all running instances of Visual Studio 2012 start cmd.exe (as admin/elevated) cd /d %windir%\i ...

  6. UVa 442 (栈) Matrix Chain Multiplication

    题意: 给出一个矩阵表达式,计算总的乘法次数. 分析: 基本的数学知识:一个m×n的矩阵A和n×s的矩阵B,计算AB的乘法次数为m×n×s.只有A的列数和B的行数相等时,两个矩阵才能进行乘法运算. 表 ...

  7. UVa 1637 (概率) Double Patience

    题意: 一共有9堆牌,每堆牌四张.每次可以取堆顶点数相同的两张牌,如果有多种方案则选取是随机的. 如果最后将所有牌取完,则视为游戏胜利,求胜利的概率. 分析: 用一个九元组表示状态,分别代表每堆牌剩余 ...

  8. RPi 2B python opencv camera demo example

    /************************************************************************************** * RPi 2B pyt ...

  9. 使用SQL Server 2005作业设置定时任务

    公司有一个老项目由于直接把终端拍摄的图片以二进制的形式保存到数据库中,数据库比较大所以需要经常删除这些冗余数据,手动删除费时费力,项目组长让我把这些操作变成自动的,每天执行一次,只保留最近两个月的图片 ...

  10. C#中如何截取Windows消息来触发自定义事件

    原文 C#中如何截取Windows消息来触发自定义事件 在c#windows开发中,我们常常会遇到拦截windows消息,来触发某个特定任务的问题. 由于目前使用c#的开发人员非常多,而且大多数c#程 ...