java对身份证验证及正则表达式解析
原文地址: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对身份证验证及正则表达式解析的更多相关文章
- js邮箱验证,身份证验证,正则表达式
邮箱验证: html部分: 邮箱验证:<input type="text" id="mail" value="" / onkeyup= ...
- Java正则表达式实现港、澳、台身份证验证
最近由于业务的要求,需要进行港.澳.台人员身份证验证,现在直接上代码,经供参考学习,也为自己积累一些工具类: package com.qiu.validate; public class regexV ...
- java身份证验证
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- 身份证号码的正则表达式及验证详解(JavaScript,Regex)
简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是&q ...
- Java国际化号码验证方法,国内手机号正则表达式
Java国际化号码验证方法,国内手机号正则表达式 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.1 ...
- 【Java】身份证号码验证
代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- Java基础之身份证验证
//简约版package test; import java.util.Scanner; public class ID { /** * 匹配算法 : 1) 得到17位身份证号码与下面给出的17位 2 ...
- inform表单验证,正则表达式,用户名,身份证,密码,验证码
最近利用空闲时间写了部分表单验证,包括用户名,身份证,密码,验证码,仅为自己巩固最近所学的知识 表单的样式使用的是table布局,因为觉得DIV布局定位比较麻烦,table有三列,分别为基本信息,输入 ...
随机推荐
- Sqlmap基础(二)
sqlmap.py -r req1.txt --dbms Oracle --risk
- C++11内存模型的粗略解释
基本解释 C++11引入了多线程,同时也引入了一套内存模型.从而提供了比较完善的一套多线程体系.在单线程时代,一切都很简单.没有共享数据,没有乱序执行,所有的指令的执行都是按照预定的时间线.但是也正是 ...
- Flex Array内置排序方法的使用
在Array类中,提供内置的排序方法.排序是在软件开发的过程中,经常遇到的问题.通过这些内置的方法,可以快速轻便的进行排序操作. Array类提供sort方法对Array实例进行排序.sort方法没有 ...
- Nandflash 驱动移植
前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...
- 手机通过WIFI连上ZXV10 H618B路由器但不能上网问题的解决
前几天朋友帮忙拿到一个ZXV10 H618B路由器,一看需要12V供电,还好以前留下一个12V输出的DC充电器,关键时刻用上了,先大概下载了此路由器的用户手册,发现原来是08年的产品,都5年了. 开始 ...
- gdb调试SAPI方式的php
一.修改php-fpm.conf文件 /usr/local/php/etc/php-fpm.conf pm.max_children = 1 #只产生一个进程,便于追踪 二.得到进行服务的进程号 [r ...
- [原]Unity3D深入浅出 - 天空盒(Skyboxes)
Unity3D中自带了9中天空盒,在Assets - Import Package - Skyboxes 即可导入天空盒资源. 为Scene添加Skybox:在Edit菜单项里的Render Sett ...
- 关于Memcache mutex设计模式的.net实现
之前在网上看过memcache-mutex的场景分析和实现代码,这里将.net方式加以实现,当然这里主要是依据原文的伪代码照猫画虎,以此做为总结及记录.如果您对相应实现感兴趣可以尝试使用本文提供的代码 ...
- SpannableStringBuilder 和 SpannableString
EditText: 通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得andr ...
- GDI+ 学习记录(26): 显示图像 - Image
//显示图像 var g: TGPGraphics; img: TGPImage; begin g := TGPGraphics.Create(Self.Canvas.Handle); ...