2016-05-24 8 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) 

私はこのエラーがその私の入力= nullを意味するが、私はできないことを理解します修理する。どんな助言も良いでしょう。私は本当にそれを理解したい!

ありがとうございました! が最後に見つかった

答え:

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])です。まったく存在しません。私はあなたの正規表現の "年"セクションの周りに丸括弧がないので、任意の解釈の下でキャプチャグループになることはできませんことに注意してください!

UPDATE - この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

ありがとう、私は問題を解決しました、あなたは正しかった!どうもありがとう! –