目录
1、校验个人身份证、证件类型、证件号之间的关系
2、校验身份证有效期是否合规
3、校验手机号
4、银行卡校验
5、校验中文姓名
6、校验英文姓名
7、校验固定电话
8、校验是否包含汉字
9、校验电子邮箱
10、校验企业证件类型和证件号
//校验国籍与证件类型,证件号码以及年龄的关系
public static String checkNativeplaceByIdTypeandIdNoandAge(String sign, String nativeplace, String idType, String idno, Integer age, String birthDay) {
String errorMsg = "";
if (StringUtils.isBlank(idType) || StringUtils.isBlank(idno) || age == null || StringUtils.isBlank(birthDay)) {
errorMsg = "校验国籍与证件类型,证件号码以及年龄的关系失败,参数有误!";
return errorMsg;
}
//中国
if (StringUtils.isNotBlank(nativeplace)) {
if (nativeplace.equals("CHN")) {
if (!idType.matches("^[045]+$")) {
if (sign.equals("1") || sign.equals("3")) {
errorMsg += "国籍为中国时 证件类型仅允许选择 身份证!";
} else {
errorMsg += "国籍为中国时 证件类型仅允许选择 身份证、户口簿、出生证明!";
}
}
}
//非中国、中国香港、中国澳门、中国台湾国籍
if (!Arrays.asList(new String[]{"CHN", "HKG", "MAC", "TWN"}).contains(nativeplace)) {
if (!idType.equals("1")) {
errorMsg += "非中国大陆居民、中国香港、中国澳门、中国台湾居民的外籍客户 证件类型暂只接受护照!";
}
}
//中国香港、中国澳门
if (Arrays.asList(new String[]{"HKG", "MAC"}).contains(nativeplace)) {
if (!idType.matches("^[7e]+$")) {
errorMsg += "国籍为中国香港、中国澳门时 证件类型仅允许选择 港澳居民来往大陆通行证和港澳居民居住证";
}
}
//中国台湾
if (nativeplace.equals("TWN")) {
if (!idType.matches("^[6f]+$")) {
errorMsg += "国籍为中国台湾时 证件类型仅允许选择 台湾居民来往大陆通行证和台湾居民居住证";
}
}
}
if (idType.matches("^[0]+$")) {
switch (idType) {
case "4":
if (age >= 16) {
errorMsg += "16周岁以下证件类型才可选户口本!";
} else {
if (!idno.matches("(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)")) {
errorMsg += "户口本填写有误(18位数字或17位数字+X)!";
}
}
break;
case "7":
if (age >= 2) {
errorMsg += "2周岁以下证件类型才可选出生证!";
} else {
if (!idno.matches("[a-zA-Z]{1}[0-9]{9}")) {
errorMsg += "出生证填写有误(字母+9位数字)!";
}
}
break;
}
} else if (idType.equals("1")) {
if (idno.length() > 18 || idno.length() < 8) {
errorMsg += "护照填写有误(8-18位字符)!";
}
} else if (idType.equals("I")) {//先保留不删除
if (!idno.matches("^([0-9A-Za-z]{15})|([0-9A-Za-z]{18})")) {
errorMsg += "外国人永久居留身份证填写有误(15或18位的数字或字母)!";
}
} else if (idType.equals("7")) {
if (nativeplace != null && !"".equals(nativeplace)) {
if (nativeplace.equals("HKG")) {
if (!idno.matches("[H]{1}[0-9]{8}")) {
errorMsg += "港澳居民来往大陆通行证填写有误(H+8位数字)!";
}
} else if (nativeplace.equals("MAC")) {
if (!idno.matches("[M]{1}[0-9]{8}")) {
errorMsg += "港澳居民来往大陆通行证填写有误(M+8位数字)!";
}
}
}
} else if (idType.equals("e")) {
if (idno.length() != 18) {
errorMsg += "港澳居民居住证填写有误(18位)!";
} else {
if (nativeplace != null && !"".equals(nativeplace)) {
if (nativeplace.equals("HKG") && (!idno.substring(0, 6).equals("810000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}"))) {
errorMsg += "港澳居民居住证填写有误(810000+8位出生日期+4位数字或字母)!";
}
if (nativeplace.equals("MAC") && (!idno.substring(0, 6).equals("820000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}"))) {
errorMsg += "港澳居民居住证填写有误(820000+8位出生日期+4位数字或字母)!";
}
}
}
} else if (idType.equals("6")) {
if (!idno.matches("^\\d{8}$")) {
errorMsg += "台湾居民来往大陆通行证填写有误(8位数字)!";
}
} else if (idType.equals("f")) {
if (idno.length() != 18) {
errorMsg += "台湾居民居住证填写有误(18位)!";
} else {
if (!idno.substring(0, 6).equals("830000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}")) {
errorMsg += "台湾居民居住证填写有误(830000+8位出生日期+4位数字或字母)!";
}
}
}
return errorMsg;
}
//校验证件有效期
public static String checkIdtypeEndDate(Integer age, String idType, String idTypeEndDate, String birthDay) {
if (age == null || StringUtils.isBlank(idType)) {
return "校验证件有效期失败:参数有误!";
}
if (!DateTimeUtil.checkFutureDate(idTypeEndDate)) {
return "证件有效期填写有误,不得小于当天日期!";
}
if (!DateTimeUtil.checkDate(idTypeEndDate, "9999-12-31")) {
System.out.println("证件有效期填写有误,不得大于9999-12-31(即长期)!");
}
try {
if (idType.equals("0")) {
if (age < 16 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 5, 1))) {
return "由于当前年龄为16周岁(不含)以下且证件类型为“0-身份证”时,则证件有效期不得超过业务办理日期+5年!";
}
if (age >= 16 && age <= 25 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 10, 1))) {
return "由于当前年龄为16周岁(含)-25周岁(含)且证件类型为“0-身份证”时,则证件有效期不得超过“业务办理日期+10年!";
}
if (age >= 26 && age <= 45 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 20, 1))) {
return "由于当前年龄为26周岁(含)-45周岁(含)且证件类型为“0-身份证”时,则证件有效期不得超过“业务办理日期+20年!";
}
}
if (idType.matches("^[167ef]+$") && idTypeEndDate.equals("9999-12-31")) {
return "证件有效期不得选择'长期'!";
}
//add by liuhaochen 暂无两种情况
if (idType.equals("10") && !idTypeEndDate.equals(DateTimeUtil.getAppointDate(new SimpleDateFormat("yyyy-MM-dd").parse(birthDay), 2, 1))) {
return "证件类型为“出生证”时,则证件有效期默认“客户出生日期+2年”且不允许修改;";
}
if (idType.equals("11") && !idTypeEndDate.equals(DateTimeUtil.getAppointDate(new SimpleDateFormat("yyyy-MM-dd").parse(birthDay), 16, 1))) {
return "证件类型为“户口本”时,则证件有效期默认“客户出生日期+16年”且不允许修改。";
}
} catch (ParseException e) {
return "校验证件有效期失败!";
}
return "";
}
/**
* 校验手机号
* @param phone
* @return
*/
public static boolean checkMobilePhone(String phone) {
String regex = "^[1]\\d{10}$";
if (StringUtil.isEmpty(phone) || phone.length() != 11) {
return false;
} else {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phone);
return m.matches();
}
}
/**
* 银行卡校验
* @param cardNo
* @return
*/
public static boolean checkBankCard(String cardNo) {
try {
int[] cardNoArr = new int[cardNo.length()];
for (int i = 0; i < cardNo.length(); i++) {
cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));
}
for (int i = cardNoArr.length - 2; i >= 0; i -= 2) {
cardNoArr[i] <<= 1;
cardNoArr[i] = cardNoArr[i] / 10 + cardNoArr[i] % 10;
}
int sum = 0;
for (int i = 0; i < cardNoArr.length; i++) {
sum += cardNoArr[i];
}
return sum % 10 == 0;
} catch (Exception e) {
return false;
}
}
/**
* 校验中文姓名
*
* 中文姓名仅限:全角汉字(例如:李明)、全角点号“·”(例如:阿凡提·莫汉莫德)、全角点号“.”(例如:阿拉汉.西提木)。
* @param params
* @return
*/
public static String checkChineseName(String params) {
if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
// Pattern CHINESENAME_PATTERN = Pattern.compile("^[\u4e00-\u9fa5.·]{0,}$");
// Pattern CHINESENAME_PATTERN = Pattern.compile("^[u2E80-uFE4F.·]{0,}$");
Pattern CHINESENAME_PATTERN = Pattern.compile("^[\u2E80-\uFE4F.·]{1,}+$");
Matcher m = CHINESENAME_PATTERN.matcher(params.trim());//params.trim() 去除字符串两端的空格
if (!m.matches()) {
return params + "中文姓名仅限:全角汉字、全角点号“·”、全角点号“.”";
}
// 利用String.replaceAll()将所有的汉字替换成空字符,利用其与原字符串的长度差得到汉字的个数。
String regex = "[\u2E80-\uFE4F]";
if (params.length() - params.replaceAll(regex, "").length() < 2) {
return "中文姓名长度至少为两个汉字";
}
return checkFirstChinese(params);
}
return "";
}
/**
* 校验英文姓名
*
* 中文姓名仅限:半角英文、半角点号“.”(例如:Jenny.Kitty)、半角空格号(例如:Jenny Kitty)、半角点号“-” (例如:Jenny-Kitty)。
* @param params
* @return
*/
public static String checkEnglishName(String params) {
if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
Pattern CHINESENAME_PATTERN = Pattern.compile("^[a-zA-Z .-]{0,}$");
String s = params.replaceAll(" +", " ");
String trim = s.trim();
Matcher m = CHINESENAME_PATTERN.matcher(trim);//params.trim() 去除字符串两端的空格
if (!m.matches()) {
return "英文姓名仅限:半角英文、半角点号“.”、半角空格号、半角点号“-”";
}
String regex = "[a-zA-Z]";
if (trim.length() - trim.replaceAll(regex, "").length() < 4) {
return "英文姓名长度至少4个字母";
}
return checkFirstEnglish(trim);
}
return "";
}
/**
* 校验固定电话
*
* 只能录入“-”、“(”、“)”、“+”、数字,如果录入其他字符,需阻断提示 有传值才校验,没传值无需校验
* @param params
* @return
*/
public static String checkTel(String params) {
if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
//String pattern = "[0-9-()+]{7,18}";
//String pattern = "[0-9-()+]{1,18}";
String pattern = "^\\d{3}-\\d{7,8}|\\d{4}-\\d{7,8}$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(params.trim());//params.trim() 去除字符串两端的空格
if (!m.matches()) {
return "固定电话格式应为:3位或4位区号-7位或8位电话号码";
}
return checkRepeat(params);
}
return "";
}
/*
* 判断是否存在汉字
* @param countname
* @return
*/
public static boolean checkcountname(String countname) {
Pattern p = Pattern.compile("[\u2E80-\uFE4F]");
Matcher m = p.matcher(countname);
if (m.find()) {
return true;
}
return false;
}
/**
* 校验电子邮箱
*
* @param email
* @return
*/
public static boolean checkEmail(String email) {
return email.matches("^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
}
/**
* 校验企业证件类型和证件号,新的校验规则
*
* @param grpIdType
* @param grpIdNo
*/
public static String checkGrpTypeAndGrpIdNo1(String grpIdType, String grpIdNo) {
// 证件号
if (grpIdNo.length() < 3) {
return "企业证件号有误!";
}
switch (grpIdType) {
// 统一社会信用代码
case "1":
// 1、统一社会信用代码长度应为18位
if (grpIdNo.length() != 18) {
return "统一社会信用代码长度应为18位!";
}
// 2、增加核心的校验规则
if (!grpIdNo.matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
return "统一社会信用代码有误,请检查!";
}
// 3、统一社会信用代码的前两位应为"11,12,13,19,21,29,31,32,33,34,35,39,41,49,51,52,53,59,61,62,69,71,72,79,81,89,91,92,93,A1,A9,N1,N2,N3,N9,Y1,54,55,37,G1"中的一个
String substring = grpIdNo.substring(0, 2);
List stringList = Arrays.asList(new String[] { "11", "12", "13", "19", "21", "29", "31", "32", "33",
"34", "35", "39", "41", "49", "51", "52", "53", "59", "61", "62", "69", "71", "72", "79", "81",
"89", "91", "92", "93", "A1", "A9", "N1", "N2", "N3", "N9", "Y1", "54", "55", "37", "G1" });
if (!stringList.contains(substring)) {
return "统一社会信用代码格式有误,前两位不符合要求!";
}
// 4、统一社会信用代码的第3-8位对应《业务代码表》中的"县及县以上行政区划代码"
String substring1 = grpIdNo.substring(2, 8);
FDCodeMapper fdCodeMapper = SpringContextUtil.getBean(FDCodeMapper.class);
int count = fdCodeMapper.selectSingleInfoByCountyCode(substring1);
if (count == 0) {
return "统一社会信用代码格式有误,3-8位不符合要求!";
}
break;
// 组织结构代码证,由8位数字加上一位校验码(数字或大写字母)组成
case "2":
if (!grpIdNo.matches("^[0-9A-Za-z]{9}$")) {
return "组织机构代码证号码有误,请检查!";
}
break;
// 税务登记证
case "3":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "税务登记证号码有误,请检查!";
}
break;
// 营业执照
case "4":
if (grpIdNo.length() == 15) {
return "营业执照证件号码有误,请检查!";
} else if (grpIdNo.length() == 18) {
if (!grpIdNo.matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
return "营业执照证件号码有误,请检查!";
}
List stringList1 = Arrays
.asList(new String[] { "11", "12", "13", "19", "21", "29", "31", "32", "33", "34", "35", "39",
"41", "49", "51", "52", "53", "59", "61", "62", "69", "71", "72", "79", "81", "89",
"91", "92", "93", "A1", "A9", "N1", "N2", "N3", "N9", "Y1", "54", "55", "37", "G1" });
if (!stringList1.contains(grpIdNo.substring(0, 2))) {
return "营业执照证件号码有误,请检查!";
}
String substring2 = grpIdNo.substring(2, 8);
FDCodeMapper fdCodeMapper1 = SpringContextUtil.getBean(FDCodeMapper.class);
int count1 = fdCodeMapper1.selectSingleInfoByCountyCode(substring2);
if (count1 == 0) {
return "营业执照证件号码有误,请检查!";
}
} else {
return "营销执照证件号格式有误!";
}
break;
// 事业单位法人证书,由任意16位字符组成
case "5":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "事业单位法人证书号码有误,请检查!";
}
break;
// 社会团体法人证书,由任意16位字符组成
case "6":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "社会团体法人证书号码有误,请检查!";
}
break;
// 民办非企业单位登记证书,由16位字母数字组成
case "7":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "民办非企业单位登记证书号码有误,请检查!";
}
break;
// 基金会法人登记证书,由16位字母数字组成
case "8":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "基金会法人登记证书号码有误,请检查!";
}
break;
// 工商注册号码,由6位首次登记机关码,8位顺序码,1位校验码组成
case "9":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "工商注册号码有误,请检查!";
}
break;
// 其他证件
case "10":
if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
return "其他证件号码有误,请检查!";
}
break;
default:
return "企业证件类型不存在!";
}
return null;
}