這裡整理了部分,特別是日期時間和身份證校正,功能相當強大,值得學習
import java.util.HashMap;<br />import java.util.Map;<br />import java.util.regex.Pattern;</p><p>public class RegexUtils {<br /> private static Pattern PATTERN_EMAIL = Pattern<br /> .compile("^[//w-]+(//.[//w-]+)*@[//w-]+(//.[//w-]+)+$");// 郵件地址<br /> private static Pattern PATTERN_TEL = Pattern<br /> .compile("^([0-9]{3,4}-)?[0-9]{7,8}$");// 固定電話<br /> private static Pattern PATTERN_MOBILE = Pattern<br /> .compile("^(//+86)?0?1[3|5]//d{9}$");// 行動電話 </p><p> private static Pattern PATTERN_ALPHA = Pattern.compile("^[A-Za-z]+$");// 字母 </p><p> private static Pattern PATTERN_DIGITAL = Pattern.compile("^//d+$");// 數字 </p><p> private static Pattern PATTERN_CHINESE = Pattern<br /> .compile("^[//u4E00-//u9FA5]+$");// 中文<br /> private static Pattern PATTERN_IDCARD_15 = Pattern<br /> .compile("^[1-9]//d{7}((0//d)|(1[0-2]))(([0|1|2]//d)|3[0-1])//d{3}$");// 15位身份證格式<br /> private static Pattern PATTERN_IDCARD_18 = Pattern<br /> .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位身份證格式 </p><p> private static Pattern PATTERN_IP = Pattern<br /> .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格式 </p><p> private static Pattern PATTERN_TIME = Pattern<br /> .compile("((0?[0-9])|([1-2][0-3]))//:([0-5]?[0-9])(//:([0-5]?[0-9]))");//時間格式 </p><p> private static Pattern PATTERN_REPEAT = Pattern.compile(".*(.).*//1.*");//重複字元格式設定 </p><p> public RegexUtils() {<br /> }</p><p> /**<br /> * 校正email格式<br /> *<br /> * @param email<br /> * email<br /> * @return<br /> */<br /> public static boolean isEmail(String email) {<br /> if (email == null)<br /> return false;<br /> else<br /> return PATTERN_EMAIL.matcher(email).matches();<br /> }</p><p> public static boolean isTelephone(String telephone) {<br /> if (telephone == null)<br /> return false;<br /> else<br /> return PATTERN_TEL.matcher(telephone).matches();<br /> }</p><p> public static boolean isMobile(String mobile) {<br /> if (mobile == null)<br /> return false;<br /> else<br /> return PATTERN_MOBILE.matcher(mobile).matches();<br /> }</p><p> public static boolean isAlpha(String alpha) {<br /> if (alpha == null)<br /> return false;<br /> else<br /> return PATTERN_ALPHA.matcher(alpha).matches();<br /> }</p><p> public static boolean isDigital(String digital) {<br /> if (digital == null)<br /> return false;<br /> else<br /> return PATTERN_DIGITAL.matcher(digital).matches();<br /> }</p><p> public static boolean isChinese(String chinese) {<br /> if (chinese == null)<br /> return false;<br /> else<br /> return PATTERN_CHINESE.matcher(chinese).matches();<br /> }</p><p> public static boolean isDateTime(String dateTime) {<br /> return isDateTime(dateTime, "-");<br /> }</p><p> /**<br /> * 校正日期時間 月 日 時間 可以不寫前面的0 ,例如 2008-9-2 3:9:1<br /> *<br /> * @param dateTime<br /> * @param partition<br /> * 分隔字元 這裡只支援 /、/、-、空格 四類分隔字元,如果是長度大於1,則取第一個字元作為分隔字元<br /> * @return 如何符合格式,返回true<br /> */<br /> public static boolean isDateTime(String dateTime, String partition) {<br /> if (dateTime == null || partition == null || "".equals(partition))<br /> return false;<br /> String s = "";</p><p> char split = partition.charAt(0);<br /> if (split != '//' && split != '/' && split != '-' && split != ' ')<br /> throw new IllegalArgumentException((new StringBuilder(<br /> "partition can not start with '")).append(partition)<br /> .append("'!").toString());<br /> s = (new StringBuilder(String.valueOf(s))).append(split).toString();</p><p> StringBuilder part = new StringBuilder(<br /> "^((//d{2}(([02468][048])|([13579][26]))");<br /> part.append(s);<br /> part.append("((((0?[13578]");<br /> part.append(")|(1[02]))");<br /> part.append(s);<br /> part.append("((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4");<br /> part.append("69])|(11))");<br /> part.append(s);<br /> part.append("((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////");<br /> part<br /> .append("s]?((0?[1-9])|([1-2][0-9])))))|(//d{2}(([02468][1235679])|([1");<br /> part.append("3579][01345789]))");<br /> part.append(s);<br /> part.append("((((0?[13578])|(1[02]))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(30)))|(0?2");<br /> part.append(s);<br /> part.append("((0?[1-9])|(1[0-9])|(2[0-8]))))))");<br /> part<br /> .append("(//s(((0?[0-9])|([1-2][0-3]))//:([0-5]?[0-9])//:([0-5]?[0-9])))?");<br /> return Pattern.matches(part.toString(), dateTime);<br /> }</p><p> public static boolean isDate(String date) {<br /> return isDate(date, "-");<br /> }</p><p> /**<br /> * 校正日期 月 日 可以不寫前面的0 ,例如 2008-9-2 3:9:1<br /> *<br /> * @param date<br /> * @param partition<br /> * 分隔字元 這裡只支援 /、/、-、空格 四類分隔字元,如果是長度大於1,則取第一個字元作為分隔字元<br /> * @return 如何符合格式,返回true<br /> */<br /> public static boolean isDate(String date, String partition) {<br /> if (date == null || partition == null || "".equals(partition))<br /> return false;<br /> String s = "";</p><p> char split = partition.charAt(0);<br /> if (split != '//' && split != '/' && split != '-' && split != ' ')<br /> throw new IllegalArgumentException((new StringBuilder(<br /> "partition can not start with '")).append(partition)<br /> .append("'!").toString());<br /> s = (new StringBuilder(String.valueOf(s))).append(split).toString();</p><p> StringBuilder part = new StringBuilder(<br /> "^((//d{2}(([02468][048])|([13579][26]))");<br /> part.append(s);<br /> part.append("((((0?[13578]");<br /> part.append(")|(1[02]))");<br /> part.append(s);<br /> part.append("((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4");<br /> part.append("69])|(11))");<br /> part.append(s);<br /> part.append("((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////");<br /> part<br /> .append("s]?((0?[1-9])|([1-2][0-9])))))|(//d{2}(([02468][1235679])|([1");<br /> part.append("3579][01345789]))");<br /> part.append(s);<br /> part.append("((((0?[13578])|(1[02]))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");<br /> part.append(s);<br /> part.append("((");<br /> part.append("0?[1-9])|([1-2][0-9])|(30)))|(0?2");<br /> part.append(s);<br /> part.append("((0?[1-9])|(1[0-9])|(2[0-8]))))))$");<br /> return Pattern.matches(part.toString(), date);<br /> }</p><p> /**<br /> * 校正時間 時間可以不寫前面的0 如 9:3:1<br /> *<br /> * @param time<br /> * 時間<br /> * @return<br /> */<br /> public static boolean isTime(String time) {<br /> if (time == null)<br /> return false;<br /> else<br /> return PATTERN_TIME.matcher(time).matches();<br /> }</p><p> /**<br /> * 嚴格校正身份證的格式,支援15位和18位校正<br /> *<br /> * @param card<br /> * @return<br /> */<br /> public static boolean isIdCard(String card) {<br /> if (card == null)<br /> return false;<br /> int length = card.length();<br /> if (length == 15) {// 15位號碼身份證<br /> if (!PATTERN_IDCARD_15.matcher(card).matches())<br /> return false;<br /> if (!addressCode.containsKey(card.substring(0, 2)))<br /> return false;<br /> String birthday = (new StringBuilder("19")).append(<br /> card.substring(6, 8)).append("-").append(<br /> card.substring(8, 10)).append("-").append(<br /> card.substring(10, 12)).toString();<br /> if (!isDate(birthday))<br /> return false;<br /> } else if (length == 18) {// 18位號碼身份證<br /> if (!PATTERN_IDCARD_18.matcher(card).matches())// 格式不匹配<br /> return false;<br /> if (!addressCode.containsKey(card.substring(0, 2)))// 不符合地區碼<br /> return false;<br /> String birthday = (new StringBuilder(card.substring(6, 10)))<br /> .append("-").append(card.substring(10, 12)).append("-")<br /> .append(card.substring(12, 14)).toString();<br /> if (!isDate(birthday))<br /> return false;<br /> int sum = 0;<br /> for (int i = 0; i < length - 1; i++)<br /> sum += (card.charAt(i) - 48) * idCoefficient[i];</p><p> char mod = idMod[sum % 11];<br /> if (mod != Character.toLowerCase(card.charAt(17)))<br /> return false;<br /> } else {<br /> return false;<br /> }<br /> return true;<br /> }</p><p> /**<br /> * 校正IP格式<br /> * @param ip<br /> * @return<br /> */<br /> public static boolean isIP(String ip) {<br /> if (ip == null)<br /> return false;<br /> else<br /> return PATTERN_IP.matcher(ip).matches();<br /> }</p><p> /**<br /> * 校正是否有重複字元<br /> * @param repeat<br /> * @return<br /> */<br /> public static boolean hasRepeat(String repeat) {<br /> if (repeat == null)<br /> return false;<br /> else<br /> return PATTERN_REPEAT.matcher(repeat).matches();<br /> }</p><p> public static Map<String, String> addressCode;<br /> public static int idCoefficient[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,<br /> 10, 5, 8, 4, 2 };<br /> public static char idMod[] = { '1', '0', 'x', '9', '8', '7', '6', '5', '4',<br /> '3', '2' };</p><p> static {<br /> addressCode = new HashMap<String, String>(35);<br /> addressCode.put("11", "/u5317/u4EAC");<br /> addressCode.put("12", "/u5929/u6D25");<br /> addressCode.put("13", "/u6CB3/u5317");<br /> addressCode.put("14", "/u5C71/u897F");<br /> addressCode.put("15", "/u5185/u8499/u53E4");<br /> addressCode.put("21", "/u8FBD/u5B81");<br /> addressCode.put("22", "/u5409/u6797");<br /> addressCode.put("23", "/u9ED1/u9F99/u6C5F");<br /> addressCode.put("31", "/u4E0A/u6D77");<br /> addressCode.put("32", "/u6C5F/u82CF");<br /> addressCode.put("33", "/u6D59/u6C5F");<br /> addressCode.put("34", "/u5B89/u5FBD");<br /> addressCode.put("35", "/u798F/u5EFA");<br /> addressCode.put("36", "/u6C5F/u897F");<br /> addressCode.put("37", "/u5C71/u4E1C");<br /> addressCode.put("41", "/u6CB3/u5357");<br /> addressCode.put("42", "/u6E56/u5317");<br /> addressCode.put("43", "/u6E56/u5357");<br /> addressCode.put("44", "/u5E7F/u4E1C");<br /> addressCode.put("45", "/u5E7F/u897F");<br /> addressCode.put("46", "/u6D77/u5357");<br /> addressCode.put("50", "/u91CD/u5E86");<br /> addressCode.put("51", "/u56DB/u5DDD");<br /> addressCode.put("52", "/u8D35/u5DDE");<br /> addressCode.put("53", "/u4E91/u5357");<br /> addressCode.put("54", "/u897F/u85CF");<br /> addressCode.put("61", "/u9655/u897F");<br /> addressCode.put("62", "/u7518/u8083");<br /> addressCode.put("63", "/u9752/u6D77");<br /> addressCode.put("64", "/u5B81/u590F");<br /> addressCode.put("65", "/u65B0/u7586");<br /> addressCode.put("71", "/u53F0/u6E7E");<br /> addressCode.put("81", "/u9999/u6E2F");<br /> addressCode.put("82", "/u6FB3/u95E8");<br /> addressCode.put("91", "/u56FD/u5916");<br /> }<br />}<br />