Проверка формата даты Regex на Java

Я просто задаюсь вопросом, существует ли путь (возможно, с regex) для проверки этого, вход на настольном приложении Java является точно строкой, форматированной как: "YYYY-MM-DD".

Я искал, но без успеха.

Спасибо

56
задан bluish 23 December 2011 в 09:55
поделиться

5 ответов

Мы использовали http://www.dynamicpdf.com/ , для таких проектов и были довольны результатом. У них есть дизайнерский инструмент PDF WYSIWYG, который вы можете использовать для создания шаблона макета вашего PDF, а также инструмент для объединения шаблона с вашими данными на основе поля для отображения столбцов. Это сохраняет часы ручного кодирования каждого элемента данного PDF. Он поддерживает заголовки страниц и нижних колонтитулов и имеет дело с слоями слоев страниц.

-121--2843400-

Используйте следующее регулярное выражение:

^\d{4}-\d{2}-\d{2}$

, как в

if (str.matches("\\d{4}-\\d{2}-\\d{2}")) {
    ...
}

с методом , анкеры ^ и $ (Начало и конец строки, соответственно) присутствуют неявно.

78
ответ дан 26 November 2019 в 17:06
поделиться

Вам нужно больше, чем Regex , например "9999-99-00" не является действительной датой. Есть SimPledateFormat класс, который построен для этого. Более тяжелый, но более всеобъемлющий.

E.G.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

boolean isValidDate(string input) {
     try {
          format.parse(input);
          return true;
     }
     catch(ParseException e){
          return false;
     }
}

К сожалению, SimpleDateFormat как тяжеловес, так и не безопасный.

30
ответ дан 26 November 2019 в 17:06
поделиться

Построить SimpleDateFormat с маской, а затем вызовите: SimpleDateFormat.parse (строка s, паруселизация p)

2
ответ дан 26 November 2019 в 17:06
поделиться

Для тонкого контроля рассмотреть вход , используя SimpleDateFormat SimpleDateFormat («Yyyy-MM-DD»)

1
ответ дан 26 November 2019 в 17:06
поделиться

Сделать все вместе:

  • Regex не проверяет значения (например, «2010-19-19»)
  • SimpleDateFormat не проверяет формат («2010-1-2», «1-0002-003» принимаются)

Необходимо использовать как для проверки формата, так и значение:

public static boolean isValid(String text) {
    if (text == null || !text.matches("\\d{4}-[01]\\d-[0-3]\\d"))
        return false;
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    df.setLenient(false);
    try {
        df.parse(text);
        return true;
    } catch (ParseException ex) {
        return false;
    }
}



ThreadLocal может использоваться, чтобы избежать создания нового SimpleDateFormat для каждого вызова.
Требуется в многопотативном контексте, поскольку SimpleDateFormat не безопасен в потоке:
private static final ThreadLocal<SimpleDateFormat> format = new ThreadLocal<SimpleDateFormat>() {
    @Override
    protected SimpleDateFormat initialValue() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setLenient(false);
        System.out.println("created");
        return df;
    }
};

public static boolean isValid(String text) {
    if (text == null || !text.matches("\\d{4}-[01]\\d-[0-3]\\d"))
        return false;
    try {
        format.get().parse(text);
        return true;
    } catch (ParseException ex) {
        return false;
    }
}

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

22
ответ дан 26 November 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: