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