常用的Regex工具类

这里整理了部分,特别是日期时间和身份证校验,功能相当强大,值得学习

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class RegexUtils {
    private static Pattern PATTERN_EMAIL = Pattern
            .compile("^[//w-]+(//.[//w-]+)*@[//w-]+(//.[//w-]+)+$");// 邮件地址 
    private static Pattern PATTERN_TEL = Pattern
            .compile("^([0-9]{3,4}-)?[0-9]{7,8}$");// 固定电话 
    private static Pattern PATTERN_MOBILE = Pattern
            .compile("^(//+86)?0?1[3|5]//d{9}$");// 移动电话 

    private static Pattern PATTERN_ALPHA = Pattern.compile("^[A-Za-z]+$");// 字母 

    private static Pattern PATTERN_DIGITAL = Pattern.compile("^//d+$");// 数字 

    private static Pattern PATTERN_CHINESE = Pattern
            .compile("^[//u4E00-//u9FA5]+$");// 中文 
    private static Pattern PATTERN_IDCARD_15 = Pattern
            .compile("^[1-9]//d{7}((0//d)|(1[0-2]))(([0|1|2]//d)|3[0-1])//d{3}$");// 15位身份证格式 
    private static Pattern PATTERN_IDCARD_18 = Pattern
            .compile("^[1-9]//d{5}[1-9]//d{3}((0//d)|(1[0-2]))(([0|1|2]//d)|3[0-1])//d{3}[//d|x|X]$");// 18位身份证格式 

    private static Pattern PATTERN_IP = Pattern
            .compile("^((00//d|1?//d?//d|(2([0-4]//d|5[0-5])))//.){3}(00//d|1?//d?//d|(2([0-4]//d|5[0-5])))$");//IP格式 

    private static Pattern PATTERN_TIME = Pattern
            .compile("((0?[0-9])|([1-2][0-3]))//:([0-5]?[0-9])(//:([0-5]?[0-9]))");//时间格式 

    private static Pattern PATTERN_REPEAT = Pattern.compile(".*(.).*//1.*");//重复字符格式 

    public RegexUtils() {
    }

    /**
     * 校验email格式
     * 
     * @param email
     *            email
     * @return
     */
    public static boolean isEmail(String email) {
        if (email == null)
            return false;
        else
            return PATTERN_EMAIL.matcher(email).matches();
    }

    public static boolean isTelephone(String telephone) {
        if (telephone == null)
            return false;
        else
            return PATTERN_TEL.matcher(telephone).matches();
    }

    public static boolean isMobile(String mobile) {
        if (mobile == null)
            return false;
        else
            return PATTERN_MOBILE.matcher(mobile).matches();
    }

    public static boolean isAlpha(String alpha) {
        if (alpha == null)
            return false;
        else
            return PATTERN_ALPHA.matcher(alpha).matches();
    }

    public static boolean isDigital(String digital) {
        if (digital == null)
            return false;
        else
            return PATTERN_DIGITAL.matcher(digital).matches();
    }

    public static boolean isChinese(String chinese) {
        if (chinese == null)
            return false;
        else
            return PATTERN_CHINESE.matcher(chinese).matches();
    }

    public static boolean isDateTime(String dateTime) {
        return isDateTime(dateTime, "-");
    }

    /**
     * 校验日期时间 月 日 时间 可以不写前面的0 ,例如 2008-9-2 3:9:1
     * 
     * @param dateTime
     * @param partition
     *            分隔符 这里只支持 /、/、-、空格 四类分隔符,如果是长度大于1,则取第一个字符作为分隔符
     * @return 如何符合格式,返回true
     */
    public static boolean isDateTime(String dateTime, String partition) {
        if (dateTime == null || partition == null || "".equals(partition))
            return false;
        String s = "";

        char split = partition.charAt(0);
        if (split != '//' && split != '/' && split != '-' && split != ' ')
            throw new IllegalArgumentException((new StringBuilder(
                    "partition can not start with '")).append(partition)
                    .append("'!").toString());
        s = (new StringBuilder(String.valueOf(s))).append(split).toString();

        StringBuilder part = new StringBuilder(
                "^((//d{2}(([02468][048])|([13579][26]))");
        part.append(s);
        part.append("((((0?[13578]");
        part.append(")|(1[02]))");
        part.append(s);
        part.append("((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4");
        part.append("69])|(11))");
        part.append(s);
        part.append("((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////");
        part
                .append("s]?((0?[1-9])|([1-2][0-9])))))|(//d{2}(([02468][1235679])|([1");
        part.append("3579][01345789]))");
        part.append(s);
        part.append("((((0?[13578])|(1[02]))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(30)))|(0?2");
        part.append(s);
        part.append("((0?[1-9])|(1[0-9])|(2[0-8]))))))");
        part
                .append("(//s(((0?[0-9])|([1-2][0-3]))//:([0-5]?[0-9])//:([0-5]?[0-9])))?");
        return Pattern.matches(part.toString(), dateTime);
    }

    public static boolean isDate(String date) {
        return isDate(date, "-");
    }

    /**
     * 校验日期 月 日 可以不写前面的0 ,例如 2008-9-2 3:9:1
     * 
     * @param date
     * @param partition
     *            分隔符 这里只支持 /、/、-、空格 四类分隔符,如果是长度大于1,则取第一个字符作为分隔符
     * @return 如何符合格式,返回true
     */
    public static boolean isDate(String date, String partition) {
        if (date == null || partition == null || "".equals(partition))
            return false;
        String s = "";

        char split = partition.charAt(0);
        if (split != '//' && split != '/' && split != '-' && split != ' ')
            throw new IllegalArgumentException((new StringBuilder(
                    "partition can not start with '")).append(partition)
                    .append("'!").toString());
        s = (new StringBuilder(String.valueOf(s))).append(split).toString();

        StringBuilder part = new StringBuilder(
                "^((//d{2}(([02468][048])|([13579][26]))");
        part.append(s);
        part.append("((((0?[13578]");
        part.append(")|(1[02]))");
        part.append(s);
        part.append("((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4");
        part.append("69])|(11))");
        part.append(s);
        part.append("((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////");
        part
                .append("s]?((0?[1-9])|([1-2][0-9])))))|(//d{2}(([02468][1235679])|([1");
        part.append("3579][01345789]))");
        part.append(s);
        part.append("((((0?[13578])|(1[02]))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");
        part.append(s);
        part.append("((");
        part.append("0?[1-9])|([1-2][0-9])|(30)))|(0?2");
        part.append(s);
        part.append("((0?[1-9])|(1[0-9])|(2[0-8]))))))$");
        return Pattern.matches(part.toString(), date);
    }

    /**
     * 校验时间 时间可以不写前面的0 如 9:3:1
     * 
     * @param time
     *            时间
     * @return
     */
    public static boolean isTime(String time) {
        if (time == null)
            return false;
        else
            return PATTERN_TIME.matcher(time).matches();
    }

    /**
     * 严格校验身份证的格式,支持15位和18位校验
     * 
     * @param card
     * @return
     */
    public static boolean isIdCard(String card) {
        if (card == null)
            return false;
        int length = card.length();
        if (length == 15) {// 15位号码身份证 
            if (!PATTERN_IDCARD_15.matcher(card).matches())
                return false;
            if (!addressCode.containsKey(card.substring(0, 2)))
                return false;
            String birthday = (new StringBuilder("19")).append(
                    card.substring(6, 8)).append("-").append(
                    card.substring(8, 10)).append("-").append(
                    card.substring(10, 12)).toString();
            if (!isDate(birthday))
                return false;
        } else if (length == 18) {// 18位号码身份证 
            if (!PATTERN_IDCARD_18.matcher(card).matches())// 格式不匹配 
                return false;
            if (!addressCode.containsKey(card.substring(0, 2)))// 不符合地区码 
                return false;
            String birthday = (new StringBuilder(card.substring(6, 10)))
                    .append("-").append(card.substring(10, 12)).append("-")
                    .append(card.substring(12, 14)).toString();
            if (!isDate(birthday))
                return false;
            int sum = 0;
            for (int i = 0; i < length - 1; i++)
                sum += (card.charAt(i) - 48) * idCoefficient[i];

            char mod = idMod[sum % 11];
            if (mod != Character.toLowerCase(card.charAt(17)))
                return false;
        } else {
            return false;
        }
        return true;
    }
   
    /**
     * 校验IP格式
     * @param ip
     * @return
     */
    public static boolean isIP(String ip) {
        if (ip == null)
            return false;
        else
            return PATTERN_IP.matcher(ip).matches();
    }
    
    /**
     * 校验是否有重复字符
     * @param repeat
     * @return
     */
    public static boolean hasRepeat(String repeat) {
        if (repeat == null)
            return false;
        else
            return PATTERN_REPEAT.matcher(repeat).matches();
    }

    public static Map<String, String> addressCode;
    public static int idCoefficient[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,
            10, 5, 8, 4, 2 };
    public static char idMod[] = { '1', '0', 'x', '9', '8', '7', '6', '5', '4',
            '3', '2' };

    static {
        addressCode = new HashMap<String, String>(35);
        addressCode.put("11", "/u5317/u4EAC");
        addressCode.put("12", "/u5929/u6D25");
        addressCode.put("13", "/u6CB3/u5317");
        addressCode.put("14", "/u5C71/u897F");
        addressCode.put("15", "/u5185/u8499/u53E4");
        addressCode.put("21", "/u8FBD/u5B81");
        addressCode.put("22", "/u5409/u6797");
        addressCode.put("23", "/u9ED1/u9F99/u6C5F");
        addressCode.put("31", "/u4E0A/u6D77");
        addressCode.put("32", "/u6C5F/u82CF");
        addressCode.put("33", "/u6D59/u6C5F");
        addressCode.put("34", "/u5B89/u5FBD");
        addressCode.put("35", "/u798F/u5EFA");
        addressCode.put("36", "/u6C5F/u897F");
        addressCode.put("37", "/u5C71/u4E1C");
        addressCode.put("41", "/u6CB3/u5357");
        addressCode.put("42", "/u6E56/u5317");
        addressCode.put("43", "/u6E56/u5357");
        addressCode.put("44", "/u5E7F/u4E1C");
        addressCode.put("45", "/u5E7F/u897F");
        addressCode.put("46", "/u6D77/u5357");
        addressCode.put("50", "/u91CD/u5E86");
        addressCode.put("51", "/u56DB/u5DDD");
        addressCode.put("52", "/u8D35/u5DDE");
        addressCode.put("53", "/u4E91/u5357");
        addressCode.put("54", "/u897F/u85CF");
        addressCode.put("61", "/u9655/u897F");
        addressCode.put("62", "/u7518/u8083");
        addressCode.put("63", "/u9752/u6D77");
        addressCode.put("64", "/u5B81/u590F");
        addressCode.put("65", "/u65B0/u7586");
        addressCode.put("71", "/u53F0/u6E7E");
        addressCode.put("81", "/u9999/u6E2F");
        addressCode.put("82", "/u6FB3/u95E8");
        addressCode.put("91", "/u56FD/u5916");
    }
}

原文地址: http://www.cnblogs.com/lovingprince/archive/2008/09/26/2166359.html


你可能感兴趣的:(regex)