谢谢老紫竹帮我改正了,我8楼的那个是工作模下的,下面这个是带有注释的,可以看得更清楚一些。
把注释、换行和空格去掉就是 8 楼的那个样子了。
从我的 blog 里面搬来的,反正放在那里也没人看。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DateRegex {
public static void main(String[] args) {
String[] str = {
"2001-00-00", "2001-01-01", "2001-01-30", "2001-01-31",
"2001-01-32", "2001-02-01", "2001-02-27", "2001-02-28",
"2004-02-29", "2001-02-29", "2001-02-30", "2001-02-31",
"2001-02-32", "2001-03-01", "2001-03-10", "2001-03-29",
"2001-03-30", "2001-03-31", "2001-03-32", "2001-04-01",
"2001-04-10", "2001-04-29", "2001-04-30", "2001-04-31",
"2001-04-32", "2001-05-01", "2001-05-10", "2001-05-29",
"2001-05-30", "2001-05-31", "2001-05-32", "2001-06-01",
"2001-06-10", "2001-06-29", "2001-06-30", "2001-06-31",
"2001-06-32", "2001-07-01", "2001-07-10", "2001-07-29",
"2001-07-30", "2001-07-31", "2001-07-32", "2001-08-01",
"2001-08-10", "2001-08-29", "2001-08-30", "2001-08-31",
"2001-08-32", "2001-09-01", "2001-09-10", "2001-09-29",
"2001-09-30", "2001-09-31", "2001-09-32", "2001-10-01",
"2001-10-10", "2001-10-29", "2001-10-30", "2001-10-31",
"2001-10-32", "2001-11-01", "2001-11-10", "2001-11-29",
"2001-11-30", "2001-11-31", "2001-11-32", "2001-12-01",
"2001-12-10", "2001-12-29", "2001-12-30", "2001-12-31",
"2001-12-32", "2001-13-01", "2001-13-10", "2001-13-29",
"2001-13-30", "2001-13-31", "2001-13-32", "245-12-04",
"100-02-29" , "200-02-29" , "300-02-29" , "400-02-29",
"500-02-29" , "800-02-29" , "900-02-29" , "2008-02-29",
"1900-02-29", "2000-02-29", "1-01-01" , "1-02-28",
"0-01-01" , "1-12-31" , "351-02-29" , "352-02-29",
"353-02-29" , "354-02-29" , "355-02-29" , "356-02-29",
"357-02-29" , "358-02-29" , "350-02-29" , "1-02-29",
"2-02-29" , "3-02-29" , "4-02-29" , "5-02-29",
"6-02-29" , "7-02-29" , "8-02-29" , "9-02-29",
"10-02-29" , "11-02-29" , "12-02-29" , "13-02-29",
"14-02-29" , "15-02-29" , "16-02-29" , "17-02-29",
"18-02-29" , "19-02-29" , "20-02-29" , "21-02-29",
"22-02-29" , "23-02-29" , "24-02-29" , "25-02-29",
"26-02-29" , "27-02-29" , "28-02-29" , "29-02-29",
"0-01-12" , "00-01-12" , "000-01-12" , "0000-01-12",
"0028-02-29"
};
String moreMonth =
"(?: \n" +
" ## 日期前是大月 \n" +
" ## 01 03 05 07 08 \n" +
" ## 10 12 月 \n" +
" (?<= \n" +
" (?: \n" +
" 0[13578] \n" +
" | \n" +
" 1[02] \n" +
" ) \n" +
" - \n" + // 分隔符
" ) \n" +
" (?: \n" +
" ## 大月的日期 29 \n" +
" 29 \n" +
" | \n" +
" ## 大月的日期 30~31 \n" +
" 3[01] \n" +
" ) \n" +
") \n";
String lesserMonth =
"(?: \n" +
" ## 日期前是小月 \n" +
" ## 04 06 09 11 月 \n" +
" (?<= \n" +
" (?: \n" +
" 0[469] \n" +
" | \n" +
" 11 \n" +
" ) \n" +
" - \n" + // 分隔符
" ) \n" +
" (?: \n" +
" ## 小月的日期 29 \n" +
" 29 \n" +
" | \n" +
" ## 小月的日期 30~31 \n" +
" 30 \n" +
" ) \n" +
") \n";
String feburary =
"(?: \n" +
" ## 29 号必须满足的条件,闰年 \n" +
" (?<= \n" +
" (?: \n" +
" ## 被 4 整除的年份 \n" +
" ## 除去最后两位为 0 的年份 \n" +
" ## 最后两位数一定是: \n" +
" ## 20 40 60 80 \n" +
" ## 04 24 44 64 84 \n" +
" ## 08 28 48 68 88 \n" +
" ## 12 32 52 72 92 \n" +
" ## 16 36 56 76 96 \n" +
" (?: \n" +
" [0-9]{0,2}(?!0?0) \n" +
" (?: \n" +
" ## 当尾数为[048]时前面不允是 \n" +
" ## [13579]中的任何一个 \n" +
" [02468]?(?<![13579])[048] \n" +
" | \n" +
" [13579][26] \n" +
" ) \n" +
" ) \n" +
" | \n" +
" ## 能被 400 整除的年份 \n" +
" ## 其头两位数字规定同上 \n" +
" (?: \n" +
" (?: \n" +
" [02468]?[048] \n" +
" | \n" +
" [13579][26] \n" +
" ) \n" +
" 00 \n" +
" ) \n" +
" ) \n" +
" -02- \n" + // 02 前后为分隔符
" ) \n" +
" (?:29) \n" +
") \n";
String debugRegex =
"(?x: \n" +
" ## 年份 0001~9999,并忽略0年 \n" +
" (?:[0-9]{1,4}(?<!^0?0?0?0)) \n" +
" - \n" + // 分隔符
" ## 月份 \n" +
" (?: \n" +
" 0[1-9] \n" +
" | \n" +
" 1[0-2] \n" +
" ) \n" +
" - \n" + // 分隔符
" (?: \n" +
" ## 公共日期 01~09 \n" +
" 0[1-9] \n" +
" | \n" +
" ## 公共日期 10~19 \n" +
" 1[0-9] \n" +
" | \n" +
" ## 公共日期 20~28 \n" +
" 2[0-8] \n" +
" | \n" +
moreMonth +
" | \n" +
lesserMonth +
" | \n" +
feburary +
" ) \n" +
")";
Pattern pattern = Pattern.compile(debugRegex);
Matcher matcher = pattern.matcher("");
for(String s : str) {
matcher.reset(s);
System.out.println(s + " " + matcher.matches());
}
}
}