import ;
import ;
import ;
import ;
import ;
public class IdCardValidate {
public static void main(String[] args) {
(vlidateIdcard("110825199004014010"));
// 构造一个符合验证的假身份证号
(genernateCert("110825199004014012"));
}
// 省份数据
private static Map<Integer, String> provs = new HashMap<>();
static {
(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, "澳门");
}
// 验证身份号前18,符合一个简单的身份证号,年是18-20开头的年份
private static boolean checkCode(String cert) {
String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
if ((regex, cert)) {
// 校验合算法
int[] factor = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
String[] parity = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
String code = (17);
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (((i))) * factor[i];
}
if (parity[sum % 11].equals(())) {
return true;
}
}
return false;
}
// 构造符合身份证号规律的身份证号
private static String genernateCert(String cert) {
String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
if ((regex, cert)) {
int[] factor = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
String[] parity = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
String code = (17);
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (((i))) * factor[i];
}
return (0,17)+parity[sum % 11];
}
return cert;
}
// 组合起来,分段验证,提高效率(符合正则使用习惯,分段验证,提高性能)
public static boolean vlidateIdcard(String cert) {
if (checkCode(cert)) {
String date = (6, 14);
if (checkDate(date)) {
if (checkProv((0, 2))) {
return true;
}
}
}
return false;
}
// 验证年
private static boolean checkDate(String date) {
String pattern = "^(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$";
if ((pattern, date)) {
String month = (4, 6);
try {
Date date2 = DateUtils.convertString2Date("yyyyMMdd", date);
// 这里检验月的原因的,润年校验
if (date2 != null && () == ((month) - 1)) {
return true;
}
} catch (Exception e) {
// TODO: handle exception
}
}
return false;
}
// 检查省份
private static boolean checkProv(String prov) {
String pattern = "^[1-9][0-9]";
if ((pattern, prov)) {
return ((prov));
}
return false;
}
}