最近测试给提了不少bug,是各种输入信息的校验问题,我一看,都是小问题,一个一个改吧。其中有一个身份证校验问题,起初是度娘,博客找有效的方法,发现回归测试后,问题并没有解决,常规的身份证都校验不过。于是,自己动手,丰衣足食。上代码!
15位、18位身份证正则式
/**
* 正则:身份证号码 15 位
*/
public static final String REGEX_ID_CARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
/**
* 正则:身份证号码 18 位
*/
public static final String REGEX_ID_CARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$";
15位、18位身份证正则式校验
/**
* 验证身份证号码 15 位
*
* @param input 待验证文本
* @return {@code true}: 匹配<br>{@code false}: 不匹配
*/
public static boolean isIDCard15(final CharSequence input) {
return isMatch(REGEX_ID_CARD15, input);
}
/**
* 验证身份证号码 18 位
*
* @param input 待验证文本
* @return {@code true}: 匹配<br>{@code false}: 不匹配
*/
public static boolean isIDCard18(final CharSequence input) {
return isMatch(REGEX_ID_CARD18, input);
}
校验身份证号码,并获取其中的出生日期,如果出生日期是合法的日期,则身份证号码有效
如果return null,说明该身份证号码不合格,否则号码合格
/**
* 校验身份证号码,并获取其中的出生日期
* @param idCardNum
* @return
*/
public static String isIDCardNumGetBirth(String idCardNum) {
if (TextUtils.isEmpty(idCardNum)) return null;
String birthday = null;
//15位身份证号的取7-12位为出生年月日,比如670101代表1967年1月1日
//18位身份证号的取7-14位为出生年月日,比如19880101代表1988年1月1日
if (idCardNum.length() == 15 && isIDCard15(idCardNum)) {
birthday = "19" + idCardNum.substring(6, 8) + "-" + idCardNum.substring(8, 10) + "-" + idCardNum.substring(10, 12);
} else if (idCardNum.length() == 18 && isIDCard18(idCardNum)) {
birthday = idCardNum.substring(6, 10) + "-" + idCardNum.substring(10, 12) + "-" + idCardNum.substring(12, 14);
} else return null;
LogUtils.e("whh0603", "isIDCardNumGetBirth=" + birthday);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
try {
sd.parse(birthday);//从给定字符串的开始解析文本,以生成一个日期
} catch (ParseException e) {
e.printStackTrace();
return null;
}
return birthday;
/* TODO 测试举例
LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
+ RegexUtils.isIDCardNumGetBirth("231124199709150420")); //有效身份证
LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
+ RegexUtils.isIDCardNumGetBirth("362228198702312844")); //无效身份证
LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
+ RegexUtils.isIDCardNumGetBirth("130503670401001")); //有效身份证 */
}
网友评论