【身份证号码的内在逻辑】

合法性

可以使用字符串判断身份证号码是否合法。校验生日是否合法,校验校验码是否正确,以下是一个示例的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。如果不满足该正则表达式,则判定为非法。

通过判断身份证号码匹配省市县名称

可以按照以下步骤设计程序:

  1. 提示用户输入身份证号码。
  2. 使用正则表达式验证输入是否为18位数字:
    • 使用 \d{17}[\dX] 进行匹配,其中 \d 表示数字,{17} 表示必须有17个数字,[\dX] 表示最后一位可以是数字或者大写字母 X。
    • 如果匹配成功,则进入下一步;否则提示用户重新输入。
  3. 验证身份证号码的真伪:
    • 将前17位数字分别乘以对应的权重,然后将结果相加。
    • 将上一步得到的结果除以11,并取余数。
    • 通过余数判断最后一位数字是否与校验位相等,如果相等则身份证号码为真,否则为假。
  4. 如果身份证号码为真,则进一步判断性别:
    • 根据身份证号码的倒数第2位数字是奇数还是偶数判断性别,奇数表示男性,偶数表示女性。
  5. 输出结果。

下面是一个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}$,用于匹配身份证号码。然后使用 PatternMatcher 类进行正则匹配。如果匹配成功,就可以从匹配结果中提取省市县的代码,然后调用相应的方法获取相应的名称。最后,输出省市县的名称。如果身份证号码不匹配,输出提示信息。

getProvinceNamegetCityNamegetCountyName 方法中,实现查询省市县名称的逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺公子之数据科学与艺术

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值