开贴在此记录正则表达式,不定期更新~~~
一、匹配时间
①匹配[yyyy-MM-dd]的正则表达式:
String reg_yyyy_MM_dd = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})" + "-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))" + "|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)";
②匹配[yyyyMMdd]的正则表达式:
String reg_yyyyMMdd = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))" + "|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))" + "|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)";
③匹配[dd/MM/yyyy]的正则表达式:
String reg_dd_MM_yyyy = "(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))" + "/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|" + "(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))";
网上传的正则表达式比较多,但是有些确实不靠谱,怎么证明我上面的几个靠谱呢?测试
附上测试代码:
import java.text.SimpleDateFormat; import java.util.Calendar; public class DateCheck { public static void main(String[] args) { //yyyy-MM-dd String reg_yyyy_MM_dd = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})" + "-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))" + "|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)"; //yyyyMMdd String reg_yyyyMMdd = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))" + "|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))" + "|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)"; //dd/MM/yyyy String reg_dd_MM_yyyy = "(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))" + "/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|" + "(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))"; Calendar calendar = Calendar.getInstance(); calendar.set(1970, 0, 1, 0, 0, 0); SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat format2 = new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat format3 = new SimpleDateFormat("dd/MM/yyyy"); Calendar today = Calendar.getInstance(); while(calendar.before(today)){ String dayString1 = format1.format(calendar.getTime()); String dayString2 = format2.format(calendar.getTime()); String dayString3 = format3.format(calendar.getTime()); if(!dayString1.matches(reg_yyyy_MM_dd)){ System.out.println(dayString1+"matches [yyyy-MM-dd] fail!"); } if(!dayString2.matches(reg_yyyyMMdd)){ System.out.println(dayString2+"matches [yyyyMMdd] fail!"); } if(!dayString3.matches(reg_dd_MM_yyyy)){ System.out.println(dayString2+"matches [dd/MM/yyyy] fail!"); } calendar.add(Calendar.DAY_OF_MONTH, 1);//增加一天 } System.out.println("检测完毕!"); } }
这些个正则表达式写起来有点小复杂,不过发现有个哥们讲述的挺详细的,感兴趣的话可以猛击这里。