2010-11-27 3 views
3

の正規表現asp.net asp:RegularExpressionValidatorを使用して正規表現を使用すると、MMddyy形式の日付を検証できます。私たちが直面している問題はうるう年です。問題は、02/29/2008が有効な日付ですが、02/29/2010は有効な日付ではないなど、有効なうるう年の日付のみを受け入れることを正規表現で確認することが可能です。aspの正規表現:MMddyy(閏年発行)の

"asp:RegularExpressionValidator"で動作する正規表現はありますか?

+0

mmddyyまたはmm/dd/yyまたはmm/dd/yyyyですか?その他の要件は? 01/01/1792は有効ですか? 99年9月9日か99年9月9日はどうですか?もしそれがmmddyyなら、1900年代と2000年代の間のカットオフはどこですか? –

+0

@Tim:そのmm/dd/yyyy。妥当性のために、私はまだ具体的な要件はないと思います。カットオフなし。 – Malik

答えて

15

OK、あなたは正規表現を求めました。ここにあります。少なくとも可能なこの獣を理解させるには、バージョンをコメントし、

まず、冗長:

^  # start of string 
(?:  # either match... 
(?: 
    (?: # 31st day of all allowed months 
    (?:(?:0?[13578]|1[02])/31) 
    | # or 
    (?:(?:0?[13-9]|1[0-2])/(?:29|30)) 
)  # 29th/30th day of any month except February 
/ # plus any year since 1600 
    (?:1[6-9]|[2-9]\d) 
    \d{2} 
) 
|  # or 
(?: # match Feb 29th 
    0?2/29/ 
    (?: # in all leap years since 1600 
    (?: 
    (?: # century 
    1[6-9]|[2-9]\d 
    ) 
    (?: # two-digit years divisible by four, not ending in 00 
    0[48] 
    | 
    [2468][048] 
    | 
    [13579][26] 
    ) 
    | 
    (?: # all the leap years ending in 00 
    (?:16|[2468][048]|[3579][26]) 
    00 
    ) 
    ) 
) 
) 
|  # or 
(?: # (for any month) 
    (?:0?[1-9]) 
    | 
    (?:1[0-2]) 
) 
/
(?: # match the 1st-28th day 
    0?[1-9]|1\d|2[0-8] 
) 
/
(?: 
    (?:1[6-9]|[2-9]\d)\d{2} 
) 
)$ 

あるいは、もし私はそれが正規表現で日付を検証するためには良い考えではありませんなぜそれがすぐに明らかだと思います

^(?:^(?:(?:(?:(?:(?:0?[13578]|1[02])/31)|(?:(?:0?[13-9]|1[0-2])/(?:29|30)))/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2/29/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))/(?:0?[1-9]|1\d|2[0-8])/(?:(?:1[6-9]|[2-9]\d)\d{2}))$)$ 

これらは許すが一桁の月/日で先行ゼロを必要としません:あなたは、ASP.NETのバリデータに冗長な正規表現を使用することはできません。それが望ましくない場合は、0?のすべてのインスタンスを0に置き換えてください。

+0

+1もしそれが動作すれば!私は本当にあなたがそれを書いていないことを願っています –

+0

私はregexlib.comで見つけた古いものを修正しました。私はそれ自身のようなものを書くつもりはありません:)そして、はい、それは動作します。マシン(tm) –

+0

ありがとうございました。私はこれを試してみましょう:) – Malik

1

閏年を検証するロジックが必要なので、を使用することを検討してください。私はこれを比較的速くまとめましたが、うまくいけばそのアイデアを得るでしょう。

protected void dateFormatValidator_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    if (args.Value.Length == 6) 
    { 
     var month = args.Value.Substring(0, 2); 
     var day = args.Value.Substring(2, 2); 
     var year = args.Value.Substring(4, 2); 

     DateTime dummyValue; 
     args.IsValid = DateTime.TryParse(month + "/" + day + "/" + year, out dummyValue); 
    } 
    else 
    { 
     args.IsValid = false; 
    } 
} 
+0

あなたの返事はありがたいですが、サーバー側はオプションではありません:( – Malik

2

サーバー側がオプションでない場合は、JavaScriptを使用する必要があります。コードを投稿し、hereを説明してみてください。それは02/29/2010が無効で02/29/2008が有効であると判断します。必要に応じてJavaScript関数を呼び出すには、CustomValidatorを使用します。

0

bitwiseはclientside JSがこれを行う方法であると言います。トムの思いやりのあるポストを恐ろしい正規表現ではありません。私は私の仕事用のマシンにかなりきちんとした日付バリデーターを持っています、私は月曜日に投稿します。

アプリで検証に失敗した場合は、その正規表現を解読しようとする悪夢を想像できますか?