Предполагая, что это не просто упражнение по использованию регулярных выражений, imho лучше всего использовать инструменты, созданные для работы. Тем более, что можно предположить, что вы будете использовать даты позже в вашем приложении. Попробуйте использовать DateTimeFormatter
и LocalDate
для управления связанными объектами.
DateTimeFormatter dfmtr =
DateTimeFormatter.ofPattern("dd/MM/uuuu").withResolverStyle(
ResolverStyle.STRICT);
for (String testDate : new String[] {
"20/11/1999", "31/11/2000", "20/11/2019", "32/33/2001",
"29/02/2016", "29/02/2015"
}) {
try {
LocalDate d = LocalDate.parse(testDate, dfmtr);
int year = d.getYear();
if (year < 2000 || year >= 3000) {
throw new DateTimeParseException(
"Year (" + year + ") out of specified range", "uuuu", 6);
}
System.out.println("VALID: " + testDate);
}
catch (DateTimeParseException dtpe) {
System.out.println("INVALID DATE: " + dtpe.getLocalizedMessage());
}
}
Вы можете даже переформатировать сообщение об ошибке, чтобы оно соответствовало сообщению по умолчанию, или использовать свое собственное вместо сообщения по умолчанию. Это также учитывает високосные годы и правильные дни для данного месяца.