编写一个java代码,对输入的一个身份证号码进行分析,若该号码不合法,输出error,若该号码合法,输出其对应的省市,年龄和性别
时间: 2023-06-13 20:03:27 浏览: 96
如何用javascript正则表达式验证身份证号码是否合法
5星 · 资源好评率100%
以下是一个基本的Java代码,用于分析身份证号码并输出相关信息:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IdCardAnalyzer {
private static Map<String, String> cityCodeMap = new HashMap<String, String>();
static {
cityCodeMap.put("11", "北京");
cityCodeMap.put("12", "天津");
cityCodeMap.put("13", "河北");
cityCodeMap.put("14", "山西");
cityCodeMap.put("15", "内蒙古");
cityCodeMap.put("21", "辽宁");
cityCodeMap.put("22", "吉林");
cityCodeMap.put("23", "黑龙江");
cityCodeMap.put("31", "上海");
cityCodeMap.put("32", "江苏");
cityCodeMap.put("33", "浙江");
cityCodeMap.put("34", "安徽");
cityCodeMap.put("35", "福建");
cityCodeMap.put("36", "江西");
cityCodeMap.put("37", "山东");
cityCodeMap.put("41", "河南");
cityCodeMap.put("42", "湖北");
cityCodeMap.put("43", "湖南");
cityCodeMap.put("44", "广东");
cityCodeMap.put("45", "广西");
cityCodeMap.put("46", "海南");
cityCodeMap.put("50", "重庆");
cityCodeMap.put("51", "四川");
cityCodeMap.put("52", "贵州");
cityCodeMap.put("53", "云南");
cityCodeMap.put("54", "西藏");
cityCodeMap.put("61", "陕西");
cityCodeMap.put("62", "甘肃");
cityCodeMap.put("63", "青海");
cityCodeMap.put("64", "宁夏");
cityCodeMap.put("65", "新疆");
cityCodeMap.put("71", "台湾");
cityCodeMap.put("81", "香港");
cityCodeMap.put("82", "澳门");
cityCodeMap.put("91", "国外");
}
public static void main(String[] args) {
String idCard = "110101201905015758";
Map<String, String> map = analyzeIdCard(idCard);
if (map == null) {
System.out.println("error");
return;
}
System.out.println(map.get("省市"));
System.out.println(map.get("年龄"));
System.out.println(map.get("性别"));
}
public static Map<String, String> analyzeIdCard(String idCard) {
if (idCard == null || idCard.trim().length() != 18) {
return null;
}
// 前17位为数字,最后一位可能是数字或X(大小写均可)
String regex = "\\d{17}[\\dXx]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(idCard);
if (!matcher.matches()) {
return null;
}
// 校验省市代码
String cityCode = idCard.substring(0, 2);
if (!cityCodeMap.containsKey(cityCode)) {
return null;
}
// 校验出生日期
String birthStr = idCard.substring(6, 14);
Date birthDate = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
birthDate = sdf.parse(birthStr);
} catch (ParseException e) {
return null;
}
// 计算年龄
Calendar birthCal = Calendar.getInstance();
birthCal.setTime(birthDate);
Calendar nowCal = Calendar.getInstance();
if (birthCal.after(nowCal)) {
return null;
}
int age = nowCal.get(Calendar.YEAR) - birthCal.get(Calendar.YEAR);
if (nowCal.get(Calendar.DAY_OF_YEAR) < birthCal.get(Calendar.DAY_OF_YEAR)) {
age--;
}
// 获取性别
String gender = idCard.substring(16, 17);
if (Integer.parseInt(gender) % 2 == 0) {
gender = "女";
} else {
gender = "男";
}
// 封装结果
Map<String, String> result = new HashMap<String, String>();
result.put("省市", cityCodeMap.get(cityCode));
result.put("年龄", String.valueOf(age));
result.put("性别", gender);
return result;
}
}
```
代码中使用了正则表达式和Map等Java中常见的数据结构,实现了身份证号码的基本分析功能。需要注意的是,这只是一个简单的示例,实际上身份证号码的校验和解析还有很多细节需要考虑,比如校验码的计算、15位身份证号码的转换等等。
阅读全文