You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java的equalsIgnoreCase()方法解决ID验证大小写问题

ID验证中小写字母不通过的问题修复

你的代码输入小写'd'时验证失败,核心问题出在第一步的字符串清理逻辑:

idNumber = idNumber.replaceAll("[^\\dABCDEFGHIJKLMNOPQRSTVWXYZ]", "");

这个正则表达式只保留数字和大写字母,输入的小写字母会被直接删除,导致处理后的ID长度不足12位,触发if(idNumber.length()!= 12 )判断直接返回false。

另外代码还有一个潜在bug:计算校验位时,remainder-1会导致数组越界。前9位数字取模23的余数范围是0-22,而校验字母字符串长度为23,直接用remainder作为索引才合理,用remainder-1当余数为0时会抛出StringIndexOutOfBoundsException。

修复后的代码

import java.util.*;

public class ValidateID{

    public static boolean validID(String idNumber){
        // 先转大写再清理,统一处理大小写问题
        idNumber = idNumber.toUpperCase().replaceAll("[^\\dA-Z]", "");
        if(idNumber.length()!= 12 ){
            return false;
        }

        // 验证前9位都是数字
        for(int i = 0; i < 9; i++){
            if(!Character.isDigit(idNumber.charAt(i)))
                return false;
        }
        
        int remainder = Integer.parseInt(idNumber.substring(0,9)) % 23;
        // 直接用余数作为索引,避免越界
        char expectedCheckLetter = "ABCDEFGHJKLMNPQRSTVWXYZ".charAt(remainder);
        
        // 此时ID已经转大写,直接比较即可
        if(idNumber.charAt(9) != expectedCheckLetter){
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter your ID number : ");
        String idNumber = scanner.nextLine();

        if(validID(idNumber)){  
            System.out.println("Your ID number is valid");
        } else {
            System.out.println("invalid ID");
        }
    }
}

关键修改说明

  • 先调用toUpperCase()把输入统一转成大写,再清理非数字和字母的字符,彻底解决大小写兼容问题
  • 修正校验位索引:用remainder替代remainder-1,避免数组越界异常
  • 因为已经统一转大写,后续直接用charAt(9)和expectedCheckLetter比较即可,无需重复转大写

内容的提问来源于stack exchange,提问作者Lawrence Mavhaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:35