合法性
可以使用字符串判断身份证号码是否合法。校验生日是否合法,校验校验码是否正确,以下是一个示例的Java代码:
也可以使用正则表达式对输入的身份证号码进行匹配判断,并根据规则验证其真伪。
public class Main {
public static void main(String[] args) {
String idCardNumber = "510101199001010001"; // 身份证号码
if (isValidIdCardNumber(idCardNumber)) {
String gender = getGender(idCardNumber);
System.out.println("身份证号码合法");
System.out.println("性别:" + gender);
} else {
System.out.println("身份证号码非法");
}
}
// 判断身份证号码是否合法
private static boolean isValidIdCardNumber(String idCardNumber) {
if (idCardNumber.length() != 18) {
return false;
}
String regex = "\\d{17}[\\dX]";
if (!idCardNumber.matches(regex)) {
return false;
}
// 可以根据需要增加其他验证逻辑,例如校验生日,校验校验码等
return true;
}
// 获取性别
private static String getGender(String idCardNumber) {
int genderCode = idCardNumber.charAt(16) - '0';
if (genderCode % 2 == 0) {
return "女";
} else {
return "男";
}
}
}
以上代码中,首先判断身份证号码的长度是否为18位,如果不是,则判定为非法。然后使用正则表达式 \\d{17}[\\dX]
判断身份证号码前17位是否为数字,且最后一位可以为数字或字母X。如果不满足该正则表达式,则判定为非法。
通过判断身份证号码匹配省市县名称
可以按照以下步骤设计程序:
- 提示用户输入身份证号码。
- 使用正则表达式验证输入是否为18位数字:
- 使用
\d{17}[\dX]
进行匹配,其中\d
表示数字,{17}
表示必须有17个数字,[\dX]
表示最后一位可以是数字或者大写字母 X。 - 如果匹配成功,则进入下一步;否则提示用户重新输入。
- 使用
- 验证身份证号码的真伪:
- 将前17位数字分别乘以对应的权重,然后将结果相加。
- 将上一步得到的结果除以11,并取余数。
- 通过余数判断最后一位数字是否与校验位相等,如果相等则身份证号码为真,否则为假。
- 如果身份证号码为真,则进一步判断性别:
- 根据身份证号码的倒数第2位数字是奇数还是偶数判断性别,奇数表示男性,偶数表示女性。
- 输出结果。
下面是一个Python示例代码:
import re
def validate_id_card(id_card):
# 验证身份证号码是否合法
pattern = r'\d{17}[\dX]'
if not re.match(pattern, id_card):
return False
# 验证身份证号码真伪
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
checksum = 0
for i in range(17):
checksum += int(id_card[i]) * factors[i]
checksum %= 11
check_digit = '10X98765432'[checksum]
if id_card[-1] != check_digit:
return False
return True
def get_gender(id_card):
gender_code = int(id_card[-2])
if gender_code % 2 == 0:
return '女性'
else:
return '男性'
while True:
id_card = input("请输入18位身份证号码:")
if len(id_card) != 18:
print("输入身份证号码非法,请重新输入。")
elif not validate_id_card(id_card):
print("输入身份证号码非法,请重新输入。")
else:
gender = get_gender(id_card)
print("身份证号码真实有效。")
print("性别:", gender)
break
可以使用正则表达式判断身份证号码是否匹配省市县名称。以下是一个示例的Java代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String idCardNumber = "510101199001010001"; // 身份证号码
String regex = "^[0-9]{2}(\\d{2})(\\d{2})(\\d{2})\\d{10}$"; // 匹配身份证号码的正则表达式
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(idCardNumber);
if (matcher.matches()) {
String provinceCode = matcher.group(1);
String cityCode = matcher.group(2);
String countyCode = matcher.group(3);
String provinceName = getProvinceName(provinceCode);
String cityName = getCityName(provinceCode, cityCode);
String countyName = getCountyName(provinceCode, cityCode, countyCode);
System.out.println("省份:" + provinceName);
System.out.println("城市:" + cityName);
System.out.println("县区:" + countyName);
} else {
System.out.println("身份证号码不匹配");
}
}
// 获取省份名称
private static String getProvinceName(String provinceCode) {
// 根据省份代码查询省份名称的逻辑实现
return "四川省";
}
// 获取城市名称
private static String getCityName(String provinceCode, String cityCode) {
// 根据省份代码和城市代码查询城市名称的逻辑实现
return "成都市";
}
// 获取县区名称
private static String getCountyName(String provinceCode, String cityCode, String countyCode) {
// 根据省份代码、城市代码和县区代码查询县区名称的逻辑实现
return "锦江区";
}
}
以上代码中,首先定义了一个正则表达式 ^[0-9]{2}(\\d{2})(\\d{2})(\\d{2})\\d{10}$
,用于匹配身份证号码。然后使用 Pattern
和 Matcher
类进行正则匹配。如果匹配成功,就可以从匹配结果中提取省市县的代码,然后调用相应的方法获取相应的名称。最后,输出省市县的名称。如果身份证号码不匹配,输出提示信息。
在 getProvinceName
、getCityName
和 getCountyName
方法中,实现查询省市县名称的逻辑。