2013-11-08 2 views
0

Проверка проверки даты с использованием регулярного выражения, как это работает на дату, но не на год? .Пожалуйста, помогите мне решить эту проблему.Regex for Java Дата проверки

Выход:

false 
true 
false 
true 

Ожидаемый результат:

false 
false 
false 
false 


public static void main(String args[]) 
{ 
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "08s21988")); 
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "08021s88")); 
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "s8021988")); 
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "0802198s"));   
} 
public static boolean dateFormatValidate(String format, String regex, String value) { 
     try { 
      if (value != null && !"".equals(value.trim()) && format != null && !"".equals(format.trim())) 
      { 
       if ((regex != null && !"".equals(regex.trim()) && Pattern.matches(regex, value)) || regex != null || "".equals(regex)) 
       { 
        SimpleDateFormat dformat = new SimpleDateFormat(format); 
        dformat.setLenient(false); 
        dformat.parse(value); 
        return true; 
       } else 
        return false; 
      } else 
       return false; 
     } catch (Exception e) {  
      return false; 
     } 
    } 
+0

Если бы я был вами, я wil 'org.apache.commons.lang.time.DateUtils # parseDate' и поймал исключение – farmer1992

+0

Зачем вам нужны регулярные выражения? Вы уже устанавливаете 'lenient = false', поэтому SimpleDateFormat должен улавливать все недопустимые форматы. –

+0

Вы не должны проверять, является ли 'format' или' regex' 'null 'или пустым. Вероятно, они не будут использоваться, поскольку это будет ошибка программирования. Если вы хотите проанализировать дату, вы должны * указать формат. –

ответ

1

@sunleo Я не думаю, что так оно не имеет ничего общего с регулярным выражением, как я только что попробовал ваш рисунок на этих четырех дат, которые вы предоставляете, и не фиксирует ни одного из них.

Я бы сказал, что ошибка в этом if:

if ((regex != null && !"".equals(regex.trim()) && Pattern.matches(regex, value)) || regex != null || "".equals(regex)) 
{ 
       // your code 
} 

В случаях, предоставленные вами в ваших главный:

regex != null - во всех случаях правда

!"".equals(regex.trim()) - все случаи истинные

Pattern.matches(regex, value)) - все случаи ложные

regex != null - во всех случаях, истинные

"".equals(regex)) - все случаи ложные


Что дает нам следующее, если:

, если ((истинную И истинно И ложно) ИЛИ истинное ИЛИ ложные)

, который является таким же, как:

, если (ложно ИЛИ истинно OR false)

, которая дает во всех случаях:


правда

Так почему вы все-таки удалось получить два ложных выходов? Вероятно, было брошено исключение здесь:

SimpleDateFormat dformat = new SimpleDateFormat(format); 
dformat.setLenient(false); 
dformat.parse(value); 

Так что в вашем изменении catch заявления return false в e.printStackTrace();.

Кроме того, моя рекомендация состояла бы в том, чтобы переупорядочить этот конкретный , если сначала проверьте его на случаи, которые должны быть ложными (в этом примере все они). Как?

Сначала переставить если, то я хотел бы начать с отладкой и проверками если таковые компонентов, чтобы увидеть их значения и, если они вычисляются правильно.

Кроме того, я думаю, что регулярное выражение не является правильным вообще (даже если это не является причиной неправильного выхода), если вы всегда используете DDMMYYYY формат и только 19xx/20xx лет, попробуйте эту модель:

^(0[1-9]|[1-2][0-9]|3[0-1])(0[1-9]|1[0-2])(19|20)\d{2}$ 

ПРИМЕЧАНИЕ

Я не проверил все это (кроме регулярных выражений) с помощью любого IDE, как у меня нет какой-либо здесь.

+0

Спасибо, что помогает. – sunleo

+0

@sunleo добро пожаловать:) – Tafari