проверить шаблон вместе с длиной в Java - PullRequest
0 голосов
/ 24 октября 2011

Я хочу проверить шаблон даты как дано (гггг-мм-дд чч: мм: сс). В приведенном ниже коде я хочу проверить все, что отличается от гггг-мм-дд чч: мм: сс, если что-то еще больше или меньше, оно должно быть ложным. Есть ли лучший способ проверки шаблона, чтобы мне не приходилось проверять длину даты отдельно?

public class CheckNumber {

   public static void main(String ...args){
       CheckNumber cn1=new CheckNumber();
       Boolean b=cn1.test("2011-10-12 08:29:56");
       System.out.println(b);
   }




   public static boolean test (String s){
       Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
       Matcher matcher = pattern.matcher(s);
       if (matcher.find()){
           return true; 
       } 
       return false; 
   }

}

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

Это зависит от того, что вы подразумеваете под «лучше». Я бы использовал SimpleDatePattern и просто попытался бы проанализировать дату: это проверило бы формат и диапазоны значений (то есть было бы исключено 32 января, а также 30 февраля).

Е.Г.

    try {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        format.setLenient(false); // disable heuristics for improper dates
        format.parse(s);
        return true;
    } catch (ParseException e) {
        return false;
    }
2 голосов
/ 24 октября 2011

Используйте matcher.matches() вместо matcher.find().Вот для чего: проверка, полностью ли соответствует строка шаблону.Вы легко нашли бы это сами, прочитав javadoc .

Если вам нужно проверить, является ли это действительной датой, используйте SimpleDateFormat.Чтобы проверить, что синтаксический анализатор формата даты полностью проанализировал вашу строку, используйте метод parse, принимающий ParsePosition в качестве аргумента, и проверьте, что позиция после анализа равна длине вашей строки.

1 голос
/ 24 октября 2011

Вы можете использовать new SimpleDateFormat(yourFormat).parse(date).Если он возвращает значение, формат в порядке, если он выдает исключение ParseException, формат является неправильным.

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 24 октября 2011

А если вы не хотите использовать предложенное выше решение SimpleDateFormat и используйте регулярное выражение.Я предлагаю следующее: ^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$

Это ужасно, но оно отфильтрует больше недействительных дат, чем та, которую вы используете в настоящее время.Он также не будет соответствовать строкам типа: "fooo 2011-10-12 08:29:56 bar" (ваш код на самом деле вернет true для таких "дат").

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