使用正则表达式验证日期

时间:2016-05-24 12:57:41

标签: java regex validation date matcher

我已经问了一个关于它的问题here,所以我决定再次从头开始。我正在尝试验证 dd-MMM-yyyy 格式但由于某种原因我总是收到错误。

这是我的代码:

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

 public class Review1_Main{

 private static Pattern DATE_VALIDATION_PATTERN =
      Pattern.compile("^(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))" +
                      "\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|" +
                      "Nov|Dec)\\-\\d{4}$");

 public static boolean validate(final String date){

 Matcher matcher = DATE_VALIDATION_PATTERN.matcher(date);

 if(matcher.matches()){

   matcher.reset();

   if(matcher.find()){

     String dd = matcher.group(1);
     String mm = matcher.group(2);
     int yy = Integer.parseInt(matcher.group(3));

     if (dd.equals("31") &&  (mm.equals("Apr") || mm.equals("Jun") ||
                              mm.equals("Sep") || mm.equals("Nov"))) {
       return false;
     } else if (mm.equals("Feb")) {

       if(yy % 4==0){
         if(dd.equals("30") || dd.equals("31")){
           return false;
         }else{
          return true;
         }
       }else{
         if(dd.equals("29")||dd.equals("30")||dd.equals("31")){
           return false;
         }else{
           return true;
         }
       }
     }else{
       return true;
     }
   }else{
     return false;
   }
 }else{
   return false;
 }
}

public static void main(String[] args) {

 Scanner s = new Scanner(System.in);
 System.out.print("Enter a date: ");
   String input = s.nextLine();
 System.out.println(validate(input));
}
}

这是我得到的错误:

Exception in thread "main" java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at Review1_Main.validate(Review1_Main.java:21)
    at Review1_Main.main(Review1_Main.java:57)

我了解此错误意味着我的输入= null ,但我无法修复它。任何建议都会很好。我真的很想了解它!

谢谢!

终于找到了答案:

private static Pattern DATE_VALIDATION_PATTERN = Pattern.compile("(0?[1-9]|[12][0-9]|3[01])-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|" +
                  "Nov|Dec)-((19|20)\\d\\d)");

1 个答案:

答案 0 :(得分:1)

基本上,问题是你试图在正则表达式中使用与输入字符串中的任何内容都不匹配的捕获组。

我不完全确定,但第三个捕获组是([0][1-9])([1-2][0-9]),或者根本没有。我注意到你的正则表达式的“年”部分周围没有任何圆括号,因此不能作为任何解释下的捕获组!

更新 - 根据此Q& A:How are nested capturing groups numbered in regular expressions? - 可以嵌套捕获组,并根据相应组的左括号的顺序对它们进行编号。

这意味着正则表达式中的捕获组3是可选的([0][1-9])组。