forked from rongchao/epmet-cloud-rizhao
2 changed files with 173 additions and 51 deletions
@ -0,0 +1,123 @@ |
|||
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("^\\w{2}\\d{7}$|^\\w{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; |
|||
} |
|||
|
|||
/** |
|||
* 解析正则 |
|||
* @param input |
|||
* @return |
|||
*/ |
|||
public static IdCardRegexUtils parse(String input) { |
|||
if (input == null) { |
|||
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; |
|||
} |
|||
} |
Loading…
Reference in new issue