合法性

可以使用字符串判断身份证号码是否合法。校验生日是否合法,校验校验码是否正确,以下是一个示例的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 "男";
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

以上代码中,首先判断身份证号码的长度是否为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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

可以使用正则表达式判断身份证号码是否匹配省市县名称。以下是一个示例的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 "锦江区";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

以上代码中,首先定义了一个正则表达式 ^[0-9]{2}(\\d{2})(\\d{2})(\\d{2})\\d{10}$,用于匹配身份证号码。然后使用 PatternMatcher 类进行正则匹配。如果匹配成功,就可以从匹配结果中提取省市县的代码,然后调用相应的方法获取相应的名称。最后,输出省市县的名称。如果身份证号码不匹配,输出提示信息。

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