【问题标题】:Regex calendar validation正则表达式日历验证
【发布时间】:2016-05-24 02:16:51
【问题描述】:

我正在尝试制作一个用户输入日期(任何日期)的程序,例如 29-Jul-1995。程序应匹配日期格式并验证此日期是否正确。

这是我的代码:

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

public class Review1_Main {

public static Pattern pattern;
public static Matcher matcher;

// DATE_PATTERN is a format for user input
private static final Pattern DATE_PATTERN = Pattern.compile("(0?[1-9]|[12][0-9]|3[01])-(^[a-zA-Z]+$)-((19|20)\\d\\d)");

// Date format validation
public static boolean dateValidation(String date) {

matcher = pattern.matcher(date);

if(matcher.matches()) {
  matcher.reset();

  if (matcher.find()) {
    int day = 01;
    String month = "Jan";
    int year = 2000;

    if(day == 31 && !month.equals("Apr") || !month.equals("Jun") ||
                    !month.equals("Sep") || !month.equals("Nov")) {
      return false;
    } else if(month.equals("Feb")) {
      // LEAP year validation
      if (year % 4 == 0) {
        if (day == 30 || day == 31) {
          return false;
        } else {
          return true;
        }
      } else {
        if (day == 29 || day == 30 || day == 31) {
          return false;
        } else {
          return true;
        }
      }// end of year % 4
    } else {
      return true;
    }// end of day.equals
  } else {
    return false;
  } // end of matcher.find
} else {
  return false;
}// end of matcher.matcher

}

 public static void main(String[] args) {
   Scanner s = new Scanner(System.in);
   String dateInput = "29-Jul-1995";
   dateValidation(dateInput);
 }

} // end of class

但是由于某种原因,当我尝试编译它时,我总是得到这个错误:

Exception in thread "main" java.lang.NullPointerException
    at Review1_Main.dateValidation(Review1_Main.java:22)
    at Review1_Main.main(Review1_Main.java:73)

第 22 行在哪里:

matcher = pattern.matcher(date);

第 73 行是:

dateValidation(dateInput);

我为我的语法道歉。

谢谢。

【问题讨论】:

标签: java regex if-statement java.util.scanner


【解决方案1】:

您在构造函数中初始化pattern,但在静态方法dateValidation 中使用它。除非您在调用方法之前使用new 构造了一个对象,否则不会初始化静态字段(因此会出现空指针异常)。

解决方案是将你的模式变成一个常量,而不是在构造函数中编译它:

private static final Pattern DATE_PATTERN = Pattern.compile("...");

然后使用常量(而不是pattern)来创建Matcher

Matcher matcher = DATE_PATTERN.match(dateInput);

您不需要patternmatcher 静态变量。

请注意,您确实没有理由使用静态方法。最好将其称为DateValidator 类并将验证方法设为实例方法。模式仍然可以是一个常数。

【讨论】:

  • 仍然出现错误,但您的回答修复了我的第一个错误Exception in thread "main" java.lang.NullPointerException at Review1_Main.dateValidation(Review1_Main.java:22) at Review1_Main.main(Review1_Main.java:73)
  • @S.Anthony 假设您的代码现在已更改,我无法帮助您解决新错误,因为我不知道第 22 行的代码是什么。
  • 不好意思,我已经更新了代码,非常感谢您的帮助
【解决方案2】:

使用 Java 8:

String dateInput = "01-Feb-2016";

List<String> months = new ArrayList<String>();
months.add("Jan");
months.add("Feb");
months.add("Mar");
months.add("Apr");
months.add("May");
months.add("Jun");
months.add("Jul");
months.add("Aug");
months.add("Sep");
months.add("Oct");
months.add("Nov");
months.add("Dec");

boolean dateIsValid = true;
try
{
    String [] vals = dateInput.split("-");
    int day = Integer.parseInt(vals[0]);
    int mon = months.indexOf(vals[1]) + 1;
    int year = Integer.parseInt(vals[2]);
    LocalDate.of(year, mon, day);
}
catch (DateTimeException e)
{
    dateIsValid = false;
}
System.out.println("Date is valid: " + dateIsValid);

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多