網頁

2017/9/18

Java Regex yyyy MM dd日期格式

在Java驗證日期格式的Regex範例如下。

String regex = "^\\d{4}[\\-/\\.](0?[1-9]|1[012])[\\-/\\.](0?[1-9]|[12][0-9]|3[01])$";
Pattern p = Pattern.compile(regex);
System.out.println(p.matcher("2017-09-19").find()); // true
System.out.println(p.matcher("2017/09/19").find()); // true
System.out.println(p.matcher("2017.09.19").find()); // true
System.out.println(p.matcher("2017-9-19").find());  // true
System.out.println(p.matcher("2017-9-1").find());   // true
System.out.println(p.matcher("2017-13-12").find()); // false
System.out.println(p.matcher("2017-9-32").find());  // false

用來分隔年月日的符號可以是-/.

但上面範例並沒有考慮2月只有28日及閏年(leap year)會有29日的情況。

若要驗證民國日期格式,只要把前面年\\d{4}的部分改成\\d{2,3}即可。

String regex = "^\\d{2,3}[\\-/\\.](0?[1-9]|1[012])[\\-/\\.](0?[1-9]|[12][0-9]|3[01])$";  // 民國日期格式

簡單說明一下regex各符號的意義

  • ^代表開始的匹配。
  • $代表結尾的匹配。
  • \\d代表匹配數字,同等於[0-9]
  • \\d後接的大括弧{4}中的數字代表前面符號要出現的次數,所以//d{4}代表可出現4次數字,例如2017或1996都匹配。
  • 中括弧[...]代表之中的任一,所以[\\-/\\.]代表-/.任一都匹配。
  • ?前面的符號可出現一次或不出現,所以0?代表0可以出現或不出現。


參考:

沒有留言:

張貼留言