A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© javaAndroid 中级黑马   /  2014-11-22 13:37  /  770 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨晚看到有位同学寻求15位18位身份证的正则
但仅仅是校验是否是身份证号
没有要求有效性
今天花了一点时间写了一个方法
用于校验身份证
大家没事玩玩,检测一下正确性
具体的计算方法可以网上搜一搜

顺便问一下正则
类似于[x|X]和[xX]的写法,有|和没有|的,两者有什么不同?
我感觉好像一样,哪位同学知道有什么不同还请告知。
  1. /**
  2. * @Description  身份证号有效性检测
  3. * @param idStr 身份证号码的字符串
  4. * @return        检测结果
  5. */
  6. public static boolean isValidCardId(String idStr) {
  7.         // 先检测是否符合基本的号码规范,不符合直接false。
  8.         if (idStr.matches("[1-9]\\d{16}[\\dxX]")) {
  9.                 // 加权因子,定义成int数组。
  10.                 final int[] QUAN = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
  11.                                 4, 2 };
  12.                 // 校验码,定义为String数组。
  13.                 final String CHECK_STR = "10X98765432";
  14.                 // 获取身份证号字符串的前17位。
  15.                 String numFore_17 = idStr.substring(0, 17);
  16.                 // 获取最后一位。即第18位。
  17.                 String numLast = idStr.substring(17);
  18.                 int sum = 0;        // 存放17位数字本体码加权的和。
  19.                 for (int i = 0; i < 17; i++) {
  20.                         // 循环取出17位数字,并与对应位置的加权因子相乘,统计和。
  21.                         sum += Integer.parseInt(String.valueOf(numFore_17.charAt(i))) * QUAN[i];
  22.                 }
  23.                 int mod = sum % 11;        // 对和进行取余。
  24.                 // mod值作为下标,取出对应的校验码。
  25.                 String result = String.valueOf(CHECK_STR.charAt(mod));
  26.                 // 将第18位字符与取出的校验码进行比较结果并返回。(忽略大小写)
  27.                 return numLast.equalsIgnoreCase(result);
  28.         }
  29.         else {
  30.                 return false;
  31.         }
  32. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马