程序只是对输入字符做简单正则校验,日期校验不支持校验闰年平年29日、大小月31日,不支持末尾校验位校验
import java.text.ParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 简单的身份证正则表达式校验
*/
public class CheckResidentIdentityCard1 {
/*
* * 方法:判断15位旧居民身份证及18位新居民身份证是否符合规范,利用正则表达式方法
* */
private static boolean regexCheck(String cardNo) {
if(null == cardNo)
return false;
cardNo = cardNo.trim();
if (15 == cardNo.length()||18 == cardNo.length()){
/* 15位旧居民身份证:
* "\\d{8}" 1~6位分别代表省市县,这里不取字典表校验,只校验是否数字。
* 7~8位代表年份后两位数字
* "(0[1-9]|1[012])" 9~10位代表月份,01~12月
* "(0[1-9]|[12]\\d|3[01])" 11~12位代表日期,1~31日
* "\\d{3}" 13~15位为三位顺序号
*
* 18位新居民身份证:
* "\\d{6}" 1~6位分别代表省市县,这里不取字典表校验,只校验是否数字。
* "(18|19|20)\\d{2}" 7~10位代表年份,前两位18、19、20即19世纪、20世纪、21世纪,后两位数字。
* 中国寿星之首:阿丽米罕·色依提,女,1886年6月25日出生于新疆疏勒县,现年134岁,身份证起始日期在19世纪
* "(0[1-9]|1[012])" 11~12位代表月份,01~12月
* "(0[1-9]|[12]\\d|3[01])" 13~14位代表日期,1~31日
* "\\d{3}" 15~17位为三位顺序号
* "(\\d|X|x)" 18位为校验位数字,允许字母x和X
*
* 正则表达式合并为:
* ^(\\d{6}(18|19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X|x))|(\\d{8}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3})$
* */
Pattern pattern = Pattern.compile("^(\\d{6}(18|19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X|x))|(\\d{8}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3})$");
Matcher m = pattern.matcher(cardNo);
return (m.matches())?true:false;
}else{
return false;
}
}
public static void main(String[] args) throws ParseException {
//数据测试
String str0="000000180001011231";
System.out.println(str0+":"+regexCheck(str0));
str0="00000x190001011231";
System.out.println(str0+":"+regexCheck(str0));
str0="000000210001011231";
System.out.println(str0+":"+regexCheck(str0));
str0="000000191301011231";
System.out.println(str0+":"+regexCheck(str0));
str0="00000019x301011231";
System.out.println(str0+":"+regexCheck(str0));
str0="000000190013011231";
System.out.println(str0+":"+regexCheck(str0));
str0="000000190012131231";
System.out.println(str0+":"+regexCheck(str0));
str0="000000190012211231";
System.out.println(str0+":"+regexCheck(str0));
str0="00000019001221x231";
System.out.println(str0+":"+regexCheck(str0));
str0="00000019000101123x";
System.out.println(str0+":"+regexCheck(str0));
str0="00000019000101123X";
System.out.println(str0+":"+regexCheck(str0));
str0="000000000101123";
System.out.println(str0+":"+regexCheck(str0));
str0="00000000010112x";
System.out.println(str0+":"+regexCheck(str0));
str0="000000000132123";
System.out.println(str0+":"+regexCheck(str0));
str0="000000001322123";
System.out.println(str0+":"+regexCheck(str0));
str0="";
System.out.println(str0+":"+regexCheck(str0));
str0=null;
System.out.println(str0+":"+regexCheck(str0));
str0="123";
System.out.println(str0+":"+regexCheck(str0));
str0="0000001900010112301";
System.out.println(str0+":"+regexCheck(str0));
str0="0000001900010112301";
System.out.println(str0+":"+regexCheck(str0));
str0="0000001900010112301";
System.out.println(str0+":"+regexCheck(str0));
str0="0000001900010112301";
System.out.println(str0+":"+regexCheck(str0));
str0="340404199710180411";
System.out.println(str0+":"+regexCheck(str0));
}
}
执行main()方法运行结果
000000180001011231:true
00000x190001011231:false
000000210001011231:false
000000191301011231:true
00000019x301011231:false
000000190013011231:false
000000190012131231:true
000000190012211231:true
00000019001221x231:false
00000019000101123x:true
00000019000101123X:true
000000000101123:true
00000000010112x:false
000000000132123:false
000000001322123:false
:false
null:false
123:false
0000001900010112301:false
0000001900010112301:false
0000001900010112301:false
0000001900010112301:false
340404199710180411:true
后续可以添加身份证末尾校验位校验,省份数据字典校验,出生日期正确校验等