1

I am reading from a file containing lines in the format YYYYMMDD. How can I use regular expressions to check the validity of these lines? Thank you. The application is a Java application.

jmj
  • 237,923
  • 42
  • 401
  • 438
yovan786
  • 633
  • 1
  • 8
  • 19

5 Answers5

8

It is impossible with regex. How will you take leap-years into account? You should try to parse the date. If parse throws an exception the date is wrong:

SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
f.setLenient(false);  <-- by default SimpleDateFormat allows 20010132
try {
   f.parse(str);
   // good
} catch (ParseExcepton e) {
   // bad
}
Evgeniy Dorofeev
  • 133,369
  • 30
  • 199
  • 275
5

You should better use SimpleDateFormat with setLenient(false); to validate your date string

jmj
  • 237,923
  • 42
  • 401
  • 438
1

like Jigar sugested it is better to use DateFormat.

public static boolean isValidDate(String date) {
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
      sdf.setLenient(false);
      sdf.parse(date);
    }
    catch (Exception e) {
      return false;
    }
    return true;
  }

helpful link

stinepike
  • 54,068
  • 14
  • 92
  • 112
1

The answers of @EvgeniyDorofeev, @JigarJoshi and @StinePike are right. But I suggest for bulk data processing a slightly different approach to avoid a logic based on expensive ParseException.

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);

for (String line : lines) { // lines from your source
  ParsePosition pos = new ParsePosition(0);
  Date date = sdf.parse(line, pos);
  boolean valid = (date != null);
  // here you can continue with processing the single line
  // can even evaluate the line number and error offset in line
}

Just a remark about regular expressions: How do you want to check the gregorian calendrical rules in such a regular expression? Months have different lengths, there are leap years and so on.

Meno Hochschild
  • 42,708
  • 7
  • 104
  • 126
0

For checking date, regular expressions are not effective. But, having said that, if you really want a regular expression, check this link

Community
  • 1
  • 1
Suresh
  • 186
  • 2
  • 14