原文地址: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. ArcGIS Runtime for Android开发教程V2.0(1)基本概念

    原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...

  2. WPF使用第三方的字体(TTF文件)

    一.准备好你要使用的字体文件,以TTF结尾的文件,然后复制到项目中,并设置Build Action(生成操作)为Resource(资源): 二.在App.xaml中或者你需要的地方添加资源的定义: & ...

  3. Jquery attr()方法 属性赋值和属性获取

    jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1. attr(属性名 ...

  4. Android中Input型输入设备驱动原理分析<一>

    话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反正这个是没变的,在android的底层开发中对于Linux的基本驱动程序设计还是没变的,当然Android底层机制也 ...

  5. SharePoint2013切换帐户登录菜单

    SharePoint2013帐户姓名显示的地方没有切换帐户的菜单,这个功能对于终端用户是可有可无的,但对于sharepoint管理员或sharepoint开发人员来讲,却是一个很重要的菜单,由于经常要 ...

  6. sizeof(数组)

    这里就不讨论一般的数组长度计算了,只说明一下任何数据到了函数的形参中都将退化为指针,所以计算大小的时候,也是计算的指针的大小 直接上代码了 // class sizeof测试.cpp : 定义控制台应 ...

  7. POI2001 Gold mine(二叉排序树 黑书经典)

    采矿(KOP) 金矿的老师傅年底要退休了.经理为了奖赏他的尽职尽责的工作,决定送他一块长方形地.长度为S,宽度为W.老师傅可以自己选择这块地.显然其中包含的采金点越多越好.你的任务就是计算最多能得到多 ...

  8. 【转】Bluetooth数据包捕获

    原文网址:http://www.cnblogs.com/hzl6255/p/3887013.html 这里介绍一种在Android上捕获蓝牙数据包的方法 1. 前提 首先你要有一部Android手机  ...

  9. (Android Studio)ActionBar's Theme/Style [ActionBar主题风格修改]

    (1)默认theme代码如下: 运行结果: 视觉效果:ActionBar为Dark,背景为Light. (2)将theme改为Light: 运行结果: 视觉效果:ActionBar和背景都为Light ...

  10. Uva 315 Network 判断割点

    模板题,注意输出 #include <stdio.h> #include <string.h> #include <algorithm> #include < ...