JAVA验证身份证格式及合法性
旅游电子商务中,预订酒店或订购门票时会以身份证作为消费凭证,为了防止客户误填身份证带来不必要麻烦,需要验证码格式及合法性,代码如下:
/** * 判断身份证格式 * * @param idNum * @return */ public static boolean isIdNum(String idNum) { // 中国公民身份证格式:长度为15或18位,最后一位可以为字母 Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])"); // 格式验证 if (!idNumPattern.matcher(idNum).matches()) return false; // 合法性验证 int year = 0; int month = 0; int day = 0; if (idNum.length() == 15) { // 一代身份证 System.out.println("一代身份证:" + idNum); // 提取身份证上的前6位以及出生年月日 Pattern birthDatePattern = Pattern.compile("\\d{6}(\\d{2})(\\d{2})(\\d{2}).*"); Matcher birthDateMather = birthDatePattern.matcher(idNum); if (birthDateMather.find()) { year = Integer.valueOf("19" + birthDateMather.group(1)); month = Integer.valueOf(birthDateMather.group(2)); day = Integer.valueOf(birthDateMather.group(3)); } } else if (idNum.length() == 18) { // 二代身份证 System.out.println("二代身份证:" + idNum); // 提取身份证上的前6位以及出生年月日 Pattern birthDatePattern = Pattern.compile("\\d{6}(\\d{4})(\\d{2})(\\d{2}).*"); Matcher birthDateMather = birthDatePattern.matcher(idNum); if (birthDateMather.find()) { year = Integer.valueOf(birthDateMather.group(1)); month = Integer.valueOf(birthDateMather.group(2)); day = Integer.valueOf(birthDateMather.group(3)); } } // 年份判断,100年前至今 Calendar cal = Calendar.getInstance(); // 当前年份 int currentYear = cal.get(Calendar.YEAR); if (year <= currentYear - 100 || year > currentYear) return false; // 月份判断 if (month < 1 || month > 12) return false; // 日期判断 // 计算月份天数 int dayCount = 31; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: dayCount = 31; break; case 2: // 2月份判断是否为闰年 if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { dayCount = 29; break; } else { dayCount = 28; break; } case 4: case 6: case 9: case 11: dayCount = 30; break; } System.out.println(String.format("生日:%d年%d月%d日", year, month, day)); System.out.println(month + "月份有:" + dayCount + "天"); if (day < 1 || day > dayCount) return false; return true; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?