31 changed files with 381 additions and 81 deletions
@ -0,0 +1,27 @@ |
|||||
|
package com.epmet.commons.tools.enums; |
||||
|
|
||||
|
/** |
||||
|
* 唯一整件类型 |
||||
|
*/ |
||||
|
public enum IdCardTypeEnum { |
||||
|
|
||||
|
OTHERS("0", "其他"), |
||||
|
SFZH("1", "身份证号"), |
||||
|
PASSPORT("2", "护照"); |
||||
|
|
||||
|
private String type; |
||||
|
private String name; |
||||
|
|
||||
|
IdCardTypeEnum(String type, String name) { |
||||
|
this.type = type; |
||||
|
this.name = name; |
||||
|
} |
||||
|
|
||||
|
public String getType() { |
||||
|
return type; |
||||
|
} |
||||
|
|
||||
|
public String getName() { |
||||
|
return name; |
||||
|
} |
||||
|
} |
@ -0,0 +1,133 @@ |
|||||
|
package com.epmet.commons.tools.utils; |
||||
|
|
||||
|
import com.epmet.commons.tools.enums.IdCardTypeEnum; |
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
import java.util.regex.Matcher; |
||||
|
import java.util.regex.Pattern; |
||||
|
|
||||
|
/** |
||||
|
* 唯一整件正则工具 |
||||
|
*/ |
||||
|
public class IdCardRegexUtils { |
||||
|
|
||||
|
/** |
||||
|
* 15位身份证号的正则表达式 |
||||
|
*/ |
||||
|
private static final Pattern PATTERN_15_ID = Pattern.compile("^\\d{6}(?<year>\\d{2})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)$"); |
||||
|
/** |
||||
|
* 18位身份证号的正则表达式 |
||||
|
*/ |
||||
|
private static final Pattern PATTERN_18_ID = Pattern.compile("^\\d{6}(?<year>\\d{4})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)[0-9a-xA-X]$"); |
||||
|
|
||||
|
/** |
||||
|
* 9位护照 |
||||
|
*/ |
||||
|
private static final Pattern PATTERN_9_PASSPORT = Pattern.compile("^[a-zA-Z]{2}\\d{7}$|^[a-zA-Z]{1}\\d{8}$"); |
||||
|
|
||||
|
private String inputText; |
||||
|
|
||||
|
private Matcher matcher; |
||||
|
|
||||
|
private IdCardTypeEnum idCardType; |
||||
|
|
||||
|
private IdCardRegexUtils(IdCardTypeEnum idCardType, Matcher matcher, String inputText) { |
||||
|
this.idCardType = idCardType; |
||||
|
this.matcher = matcher; |
||||
|
this.inputText = inputText; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 正则解析结果 |
||||
|
*/ |
||||
|
@Data |
||||
|
@AllArgsConstructor |
||||
|
@NoArgsConstructor |
||||
|
public static class ParsedContent { |
||||
|
private String birthdayYear; |
||||
|
private String birthdayMonth; |
||||
|
private String birthdayDay; |
||||
|
private String sex; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* desc:校验输入的证件号是否合法 |
||||
|
* @param input |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean validateIdCard(String input){ |
||||
|
IdCardRegexUtils parse = IdCardRegexUtils.parse(input); |
||||
|
return parse != null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 解析正则 |
||||
|
* @param input |
||||
|
* @return |
||||
|
*/ |
||||
|
public static IdCardRegexUtils parse(String input) { |
||||
|
if (input == null || input.trim().length() == 0) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
if (input.length() == 15) { |
||||
|
Matcher matcher = PATTERN_15_ID.matcher(input); |
||||
|
if (matcher.matches()) { |
||||
|
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (input.length() == 18) { |
||||
|
Matcher matcher = PATTERN_18_ID.matcher(input); |
||||
|
if (matcher.matches()) { |
||||
|
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (input.length() == 9) { |
||||
|
Matcher matcher = PATTERN_9_PASSPORT.matcher(input); |
||||
|
if (matcher.matches()) { |
||||
|
return new IdCardRegexUtils(IdCardTypeEnum.PASSPORT, matcher, input); |
||||
|
} |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取解析结果 |
||||
|
* @return |
||||
|
*/ |
||||
|
public ParsedContent getParsedResult() { |
||||
|
if (matcher == null || idCardType == null) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
if (IdCardTypeEnum.SFZH == idCardType) { |
||||
|
//是身份证号,可以解析
|
||||
|
String year; |
||||
|
if (inputText.length() == 15) { |
||||
|
// 15位身份证号,years前需要拼上19
|
||||
|
year = "19".concat(matcher.group("year")); |
||||
|
} else { |
||||
|
year = matcher.group("year"); |
||||
|
} |
||||
|
String month = matcher.group("month"); |
||||
|
String day = matcher.group("day"); |
||||
|
String sex = matcher.group("sex"); |
||||
|
return new ParsedContent(year, month, day, sex); |
||||
|
} |
||||
|
|
||||
|
// 其他类型暂时不可解析
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取类型枚举 |
||||
|
* @return |
||||
|
*/ |
||||
|
public IdCardTypeEnum getTypeEnum() { |
||||
|
return idCardType; |
||||
|
} |
||||
|
} |
Binary file not shown.
Loading…
Reference in new issue