身份證號java正則表示式驗證
阿新 • • 發佈:2019-02-02
public class Verification { private final static Map<String, String> cityMap; static { cityMap = new HashMap<>(); cityMap.put("11", "北京"); cityMap.put("12", "天津"); cityMap.put("13", "河北"); cityMap.put("14", "山西"); cityMap.put("15", "內蒙古"); cityMap.put("21", "遼寧"); cityMap.put("22", "吉林"); cityMap.put("23", "黑龍江"); cityMap.put("31", "上海"); cityMap.put("32", "江蘇"); cityMap.put("33", "浙江"); cityMap.put("34", "安徽"); cityMap.put("35", "福建"); cityMap.put("36", "江西"); cityMap.put("37", "山東"); cityMap.put("41", "河南"); cityMap.put("42", "湖北"); cityMap.put("43", "湖南"); cityMap.put("44", "廣東"); cityMap.put("45", "廣西"); cityMap.put("46", "海南"); cityMap.put("50", "重慶"); cityMap.put("51", "四川"); cityMap.put("52", "貴州"); cityMap.put("53", "雲南"); cityMap.put("54", "西藏"); cityMap.put("61", "陝西"); cityMap.put("62", "甘肅"); cityMap.put("63", "青海"); cityMap.put("64", "寧夏"); cityMap.put("65", "新疆"); cityMap.put("71", "臺灣"); cityMap.put("81", "香港"); cityMap.put("82", "澳門"); cityMap.put("91", "國外"); } //粗略的校驗 private static final Pattern pattern = Pattern.compile("^(\\d{6})(19|20)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d|X|x)?$"); /** * 18位身份證校驗,粗略的校驗 * @author lyl * @param idCard * @return */ public static boolean is18ByteIdCard(CharSequence idCard){ return pattern.matcher(idCard).matches(); } /** * 18位身份證校驗,比較嚴格校驗 * @author lyl * @param idCard * @return */ public static boolean is18ByteIdCardComplex(CharSequence idCard){ int[] prefix = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char[] suffix = new char[]{ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; if(is18ByteIdCard(idCard)){ if(cityMap.get(idCard.subSequence(0,2).toString()) == null ){ return false; } int idCardWiSum=0; //用來儲存前17位各自乖以加權因子後的總和 for(int i=0;i<17;i++){ idCardWiSum+=(idCard.charAt(i) - '0') *prefix[i]; } int idCardMod=idCardWiSum%11;//計算出校驗碼所在陣列的位置 char idCardLast=idCard.charAt(17);//得到最後一位身份證號碼 return idCardLast == suffix[idCardMod]; } return false; }