проверка даты регулярного выражения для yyyyMMdd - PullRequest
2 голосов
/ 19 мая 2011

Я ищу строку регулярного выражения, которая будет проверять даты в формате yyyyMMdd (без разделителей) и работает в течение високосных лет.Самая близкая вещь, которую я нашел, только проверяет даты с 2000 года.

import java.util.regex.Pattern;

public class TestDate {
  public static final Pattern datePattern = Pattern.compile("** Need RegEx **");

  public static void main(String[] args) {
    System.out.println(datePattern.matcher("19960229").matches());
  }
}

Ответы [ 3 ]

8 голосов
/ 19 мая 2011

Я предлагаю использовать java.text.DateFormat, как показано на этой странице :

public static boolean isValidDateStr(String date) {
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
      sdf.setLenient(false);
      sdf.parse(date);
    }
    catch (ParseException e) {
      return false;
    }
    catch (IllegalArgumentException e) {
      return false;
    }
    return true;
  }
2 голосов
/ 19 мая 2011

Я использую регулярные выражения для этого почти невозможно из-за сложного расчета, необходимого для високосных лет.Джон Скит прав: используйте для этого new SimpleDateFormat("yyyyMMdd").

1 голос
/ 19 мая 2011

регулярное выражение для високосного года очень сложное: наглядный пример: (это также включает проверку полной даты)

"(((\\d\\d)(0[48]|[2468][048]|[13579][26])|([02468][048]|[13579][26])(00))(02)([012]\\d))|(\\d\\d([02468][1235679]|[13579][01345789])(02)([01]\\d|2[012345678]))|(\\d\\d\\d\\d((0[13578]|1[02])([012]\\d|3[01])|((0[46]|11)([012]\\d|30))))"

первый раздел выделяет общий случай с не заканчивающимся на 00

во втором разделе указан год столетия, поэтому только годы, кратные 400, являются високосными (1900 не високосный год)

затем в последнем разделе он обрабатывает все остальные месяцы

(я на самом деле не проверял это, но он должен работать достаточно близко)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...