title :使用正则表达式校验时间,精确到秒,包括年月日时分秒,14位格式精确校验,正则表达式精确校验时间
今天做项目的时候遇到了校验日期的需求;
要求:精确校验14位的时间格式:yyyyMMddHHmmss,e.g.:20161213232255
要求时间绝对存在,举几个不存在的例子.1月32号,2月30日,24时,4点60分,等等。
说白了就是时间绝对存在而且考虑到平年2月28天,闰年2月29天等等。
为了综合考虑各种格式的时间,我做了以下精确分解,综合考虑:
part_1:时间格式:yyyyMMddHHmmss.例如:20161213232255
正则表达式为:
String timeRegex = "^((([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))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
测试代码:
public void test() {
// 不带‘-’或‘:’或‘ ’
// 不能带杠,冒号,空格,而且必须14位:e.g : 20161213164858是合法的;
// 这个是超级精确的校验
String timeRegex = "^((([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))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
boolean b_2 = Pattern.matches(timeRegex, "20200229164859");
System.out.println("timeRex : mathcesl : " + b_2);
}
part_2:精确到日即可,即年月日,格式:yyyyMMdd,例如:20161213
正则表达式为:
String yyyyMMdd_Regex_2 = "^((([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))$";
测试代码:
public static void test_4() {
String yyyyMMdd_Regex_2 = "^((([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))$";
boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
System.out.println("b_3 : " + b_3);
}
part_3:精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13
正则表达式为:
String timeRegex_2 = "^((([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))$";
测试代码:
public static void test_5() {
String timeRegex_2 = "^((([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))$";
boolean b_3 = Pattern.matches(timeRegex_2, "2020-02-29");
System.out.println("b_3 : " + b_3);
}
part_4:校验时分秒:格式:HHmmss
正则表达式为:
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
测试代码:
public static void test_6() {
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
boolean b_3 = Pattern.matches(timeRegex_2, "230059");
System.out.println("b_3 : " + b_3);
}
part_5:校验时分秒:格式:HH-mm-ss
正则表达式为:
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";
测试代码:
public static void test_7() {
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";
boolean b_3 = Pattern.matches(timeRegex_2, "23-00-55");
System.out.println("b_3 : " + b_3);
}
part_6;还有 一种情况有可能大家会用到:yyyy-MM-dd HH:mm:ss(日期和时间之间有一个或多个空格)
正则表达式为:
String timeRegex = "^((([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))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
测试代码:
public static void test_8() {
String timeRegex = "^((([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))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
boolean b_2 = Pattern.matches(timeRegex, "2020-02-29 23:48:59");
System.out.println("timeRex : mathcesl : " + b_2);
}
最后:我把自己测试的整个类粘贴过来,因为有些哥们可能还有别的需求需要被满足;那结合这些自己再研究一下吧:
package cn.mike.test_1213;
import java.util.regex.Pattern;
public class Check_F801_Datagram {
public static void main(String[] args) {
// test();
// test_2();
// test_3();
// test_4();
// test_5();
// test_6();
// test_7();
test_8();
}
public static void test() {
// 不带‘-’或‘:’或‘ ’
// 不能带杠,冒号,空格,而且必须14位:e.g : 20161213164858是合法的;
// 这个是超级精确的校验
String timeRegex = "^((([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))([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
boolean b_2 = Pattern.matches(timeRegex, "20200229164859");
System.out.println("timeRex : mathcesl : " + b_2);
}
public static void test_2() {
String timeRegex = "^((([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))======([0-1]?[0-9]|2[0-3])======([0-5][0-9])======([0-5][0-9])$";
boolean b_2 = Pattern.matches(timeRegex,
"2020======02===28======16======48======58");
System.out.println("timeRex : mathcesl : " + b_2);
}
public static void test_3() {
String yyyyMMdd_Regex = "^((([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))$";
boolean b_2 = Pattern.matches(yyyyMMdd_Regex, "2020======02===28");
System.out.println("timeRex : mathcesl : " + b_2);
String yyyyMMdd_Regex_2 = "^((([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))$";
boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
System.out.println("b_3 : " + b_3);
}
// part_2:精确到日即可,即年月日,格式:yyyyMMdd,例如:20161213
public static void test_4() {
String yyyyMMdd_Regex_2 = "^((([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))$";
boolean b_3 = Pattern.matches(yyyyMMdd_Regex_2, "20200228");
System.out.println("b_3 : " + b_3);
}
// part_3:精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13
public static void test_5() {
String timeRegex_2 = "^((([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))$";
boolean b_3 = Pattern.matches(timeRegex_2, "2020-02-29");
System.out.println("b_3 : " + b_3);
}
// part_4:校验时分秒:格式:HHmmss
public static void test_6() {
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
boolean b_3 = Pattern.matches(timeRegex_2, "230059");
System.out.println("b_3 : " + b_3);
}
// part_4:校验时分秒:格式:HH-mm-ss
public static void test_7() {
String timeRegex_2 = "([0-1]?[0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9])$";
boolean b_3 = Pattern.matches(timeRegex_2, "23-00-55");
System.out.println("b_3 : " + b_3);
}
// part_6;还有 一种情况有可能大家会用到:yyyy-MM-dd HH:mm:ss
// (日期和时间之间有一个或多个空格)//
public static void test_8() {
String timeRegex = "^((([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))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
boolean b_2 = Pattern.matches(timeRegex, "2020-02-29 23:48:59");
System.out.println("timeRex : mathcesl : " + b_2);
}
}