今天晚上單位測試問了我這道題疚沐。寫的挺慢的待锈。正式面試問的話應該已經(jīng)掛了格遭。
我這里要滿足的時間格式 XXXX-XX-XX
分析
先想想閏年有幾種情況
- 能被4整除
并且 - 當能被100整除的時候罩抗,必須能被400整除求摇,所以1600可以窍荧,但1500就不行辉巡。
先看最特殊的閏年-被400整除
用最笨的方法找規(guī)律。
0000蕊退,0400郊楣,0800憔恳,1200,1600
2000净蚤,2400钥组,2800,3200今瀑,3600
4000程梦,4400,4800橘荠,5200屿附,5600
得到的規(guī)律就是
在第一位是0,2,4,6,8時第二位可以是0,4,8
在第一位是1,3,5,7,9時,第二位可以說2,6
那我們得到的第一種情況的年份的正則表達式應該是
([02468][048]00) | ([13579][26]00)
再來看第二種情況的閏年-能被4整除哥童,且不是100的倍數(shù)
還是先找規(guī)律
0000挺份,0004,0008贮懈,0012匀泊,0016
0020,0024朵你,0028各聘,0032,0036
0040抡医,0044躲因,0048,0052魂拦,0056
那對應的規(guī)律可以說是
前兩位隨意毛仪,第三位是0,2,4,6,8時。對應的第四位0芯勘,4箱靴,8
第三位是1,3,5時,對應的第四位是2,6
那第二種年份的正則表達式是
([0-9]{2}) (([02468][048]) | [13579][26])
到這里荷愕,閏年的情況就討論完了衡怀。
第三種是任意的四個數(shù)字 [0-9]{4}
在正則表達式里,這三種情況的排序應該是從最特殊到最一般安疗。也就是上文提到的排序抛杨。
然后考慮月份
1,3,5,7,8,10,12月對應的是31天,對應的表達式 (-xx-xx格式)
- (0[13578]) | (1[02]) - ((0[1-9]) | ([12][0-9]) | (3[01]))
同樣荐类,4,6,9,11月對應的是30天
-((0[2469]) | (11))- ((0[1-9]) | ([12][0-9]) | (30))
最后對于二月
閏年: (-02-((0[1-9]) | ([12][0-9]))
平年:(-02-((0[1-9]) | (1[0-9] | 2[0-8]))
然后把月份和年份的表達式組合起來
特殊閏年+閏年月日 | 普通閏年 + 閏年月日 | 普通年 + 普通月日
這一步其實很麻煩怖现。會有很多的括號需要調(diào)整,感覺半個多小時的時間都浪費在這上頭了
得到的代碼是這樣的(不一定對,簡單測一下好像還行)
public class TimePattern {
public static void main(String[] args ) {
String pattern =
"((([02468][048]00)|([13579][26]00))" +
"(-02-((0[1-9])|([12][0-9])))|" +
"(-((0[13578])|(1[02]))-((0[1-9])|([12][0-9])|(3[01])))|" +
"(-(0[469]|11)-((0[1-9])|([12][0-9])|30)))"
+ "|" +
"(([0-9]{2})([02468][048]|[13579][26])" +
"((-02-((0[1-9])|([12][0-9])))|" +
"(-((0[13578])|(1[02]))-((0[1-9])|([12][0-9])|(3[01])))|" +
"(-(0[469]|11)-((0[1-9])|([12][0-9])|30))))"
+ "|" +
"(([0-9]{4})" +
"((-02-((0[1-9])|(([1][0-9])|([2][0-8]))))|" +
"(-((0[13578])|(1[02]))-((0[1-9])|([12][0-9])|(3[01])))|" +
"(-(0[469]|11)-((0[1-9])|([12][0-9])|30))))";
System.out.println(Pattern.matches(pattern, "1900-04-31")); //true
System.out.println(Pattern.matches(pattern, "1900-04-30")); //true
System.out.println(Pattern.matches(pattern, "1601-02-29")); //false
System.out.println(Pattern.matches(pattern, "1604-02-29")); //true
System.out.println(Pattern.matches(pattern, "1900-02-29")); //false
System.out.println(Pattern.matches(pattern, "0000-02-29")); // true
System.out.println(Pattern.matches(pattern, "99999-02-28")); //false
System.out.println(Pattern.matches(pattern, "1421-09-31")); //false
System.out.println(Pattern.matches(pattern, "1440-02-29")); //true
System.out.println(Pattern.matches(pattern, "1440-14-29")); //false
}