2016-05-24 2 views
-1

Я уже задал вопрос об этом here, поэтому я решил сделать это с нуля еще раз. Я пытаюсь проверить формат dd-MMM-yyyy, но по какой-то причине я всегда получаю сообщение об ошибке.Дата проверки с помощью регулярного выражения

Вот мой код:

import java.util.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Review1_Main{ 

private static Pattern DATE_VALIDATION_PATTERN = 
     Pattern.compile("^(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))" + 
         "\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|" + 
         "Nov|Dec)\\-\\d{4}$"); 

public static boolean validate(final String date){ 

Matcher matcher = DATE_VALIDATION_PATTERN.matcher(date); 

if(matcher.matches()){ 

    matcher.reset(); 

    if(matcher.find()){ 

    String dd = matcher.group(1); 
    String mm = matcher.group(2); 
    int yy = Integer.parseInt(matcher.group(3)); 

    if (dd.equals("31") && (mm.equals("Apr") || mm.equals("Jun") || 
           mm.equals("Sep") || mm.equals("Nov"))) { 
     return false; 
    } else if (mm.equals("Feb")) { 

     if(yy % 4==0){ 
     if(dd.equals("30") || dd.equals("31")){ 
      return false; 
     }else{ 
      return true; 
     } 
     }else{ 
     if(dd.equals("29")||dd.equals("30")||dd.equals("31")){ 
      return false; 
     }else{ 
      return true; 
     } 
     } 
    }else{ 
     return true; 
    } 
    }else{ 
    return false; 
    } 
}else{ 
    return false; 
} 
} 

public static void main(String[] args) { 

Scanner s = new Scanner(System.in); 
System.out.print("Enter a date: "); 
    String input = s.nextLine(); 
System.out.println(validate(input)); 
} 
} 

А вот ошибка я получаю:

Exception in thread "main" java.lang.NumberFormatException: null 
    at java.lang.Integer.parseInt(Integer.java:542) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Review1_Main.validate(Review1_Main.java:21) 
    at Review1_Main.main(Review1_Main.java:57) 

Я понимаю, что значит эта ошибка, что мой вход = нуль, но я не могу почини это. Любые советы были бы хорошими. Я действительно хочу это понять!

Спасибо!

Наконец нашел ответ:

private static Pattern DATE_VALIDATION_PATTERN = Pattern.compile("(0?[1-9]|[12][0-9]|3[01])-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|" + 
        "Nov|Dec)-((19|20)\\d\\d)"); 
+0

Зачем нужна ручная проверка? Просто используйте [DateTimeFormatter] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) и поймайте исключение. –

+0

@ S.Kadakov Я знаю, что мне не разрешено публиковать мои «задания» здесь, но это то, что мой учитель хочет получить от меня, я уже сделал это с 'DateTimeFormatter' –

ответ

1

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

Я не совсем уверен, но 3-я группа захвата - ([0][1-9]) или ([1-2][0-9]), или их нет. Я отмечаю, что у вас нет круглых скобок вокруг раздела «год» вашего регулярного выражения, так что это не может быть группа захвата при любой интерпретации!

ОБНОВЛЕНИЕ - в соответствии с этим Q & A: How are nested capturing groups numbered in regular expressions? - группы захвата могут быть вложенными, и они пронумерованы в соответствии с порядком открытия кронштейна соответствующей группы.

Это означает, что группа захвата 3 в вашем регулярном выражении является необязательной группой ([0][1-9]).

+0

Я справился с этим [здесь] (http://stackoverflow.com/questions/10931179/need-regular-expression-for-validating-date-in-dd-mmm-yyyy-format) –

+0

Я уверен, что ваш учитель будет рад услышать это: -). Нет ничего плохого в том, что вы скопировали регулярное выражение, но вы не можете его использовать, как будто вы пытаетесь его использовать! –

+0

Спасибо, очень сильно, я исправил свою проблему, вы были правы! Большое спасибо! –

Смежные вопросы