昨晚看到有位同学寻求15位18位身份证的正则
但仅仅是校验是否是身份证号
没有要求有效性
今天花了一点时间写了一个方法
用于校验身份证
大家没事玩玩,检测一下正确性
具体的计算方法可以网上搜一搜
顺便问一下正则
类似于[x|X]和[xX]的写法,有|和没有|的,两者有什么不同?
我感觉好像一样,哪位同学知道有什么不同还请告知。
- /**
- * @Description 身份证号有效性检测
- * @param idStr 身份证号码的字符串
- * @return 检测结果
- */
- public static boolean isValidCardId(String idStr) {
- // 先检测是否符合基本的号码规范,不符合直接false。
- if (idStr.matches("[1-9]\\d{16}[\\dxX]")) {
- // 加权因子,定义成int数组。
- final int[] QUAN = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
- 4, 2 };
- // 校验码,定义为String数组。
- final String CHECK_STR = "10X98765432";
- // 获取身份证号字符串的前17位。
- String numFore_17 = idStr.substring(0, 17);
- // 获取最后一位。即第18位。
- String numLast = idStr.substring(17);
- int sum = 0; // 存放17位数字本体码加权的和。
- for (int i = 0; i < 17; i++) {
- // 循环取出17位数字,并与对应位置的加权因子相乘,统计和。
- sum += Integer.parseInt(String.valueOf(numFore_17.charAt(i))) * QUAN[i];
- }
- int mod = sum % 11; // 对和进行取余。
- // mod值作为下标,取出对应的校验码。
- String result = String.valueOf(CHECK_STR.charAt(mod));
- // 将第18位字符与取出的校验码进行比较结果并返回。(忽略大小写)
- return numLast.equalsIgnoreCase(result);
- }
- else {
- return false;
- }
- }
复制代码 |
|