原文地址: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. Sqlmap基础(二)

    sqlmap.py -r req1.txt --dbms Oracle --risk

  2. C++11内存模型的粗略解释

    基本解释 C++11引入了多线程,同时也引入了一套内存模型.从而提供了比较完善的一套多线程体系.在单线程时代,一切都很简单.没有共享数据,没有乱序执行,所有的指令的执行都是按照预定的时间线.但是也正是 ...

  3. Flex Array内置排序方法的使用

    在Array类中,提供内置的排序方法.排序是在软件开发的过程中,经常遇到的问题.通过这些内置的方法,可以快速轻便的进行排序操作. Array类提供sort方法对Array实例进行排序.sort方法没有 ...

  4. Nandflash 驱动移植

    前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...

  5. 手机通过WIFI连上ZXV10 H618B路由器但不能上网问题的解决

    前几天朋友帮忙拿到一个ZXV10 H618B路由器,一看需要12V供电,还好以前留下一个12V输出的DC充电器,关键时刻用上了,先大概下载了此路由器的用户手册,发现原来是08年的产品,都5年了. 开始 ...

  6. gdb调试SAPI方式的php

    一.修改php-fpm.conf文件 /usr/local/php/etc/php-fpm.conf pm.max_children = 1 #只产生一个进程,便于追踪 二.得到进行服务的进程号 [r ...

  7. [原]Unity3D深入浅出 - 天空盒(Skyboxes)

    Unity3D中自带了9中天空盒,在Assets - Import Package - Skyboxes 即可导入天空盒资源. 为Scene添加Skybox:在Edit菜单项里的Render Sett ...

  8. 关于Memcache mutex设计模式的.net实现

    之前在网上看过memcache-mutex的场景分析和实现代码,这里将.net方式加以实现,当然这里主要是依据原文的伪代码照猫画虎,以此做为总结及记录.如果您对相应实现感兴趣可以尝试使用本文提供的代码 ...

  9. SpannableStringBuilder 和 SpannableString

    EditText:         通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得andr ...

  10. GDI+ 学习记录(26): 显示图像 - Image

    //显示图像 var   g: TGPGraphics;   img: TGPImage; begin   g := TGPGraphics.Create(Self.Canvas.Handle);   ...