如何用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
相关产品推荐
相关产品推荐

