3

日付をMMddyy形式で検証するには、asp.net asp:RegularExpressionValidatorで機能する正規表現のヘルプが必要です。私たちが直面している問題はうるう年です。問題は、2008年2月29日が有効な日付であるが、2010年2月29日が有効な日付ではないなど、有効なうるう年の日付のみを受け入れることを正規表現で確認できることです。

「asp:RegularExpressionValidator」で機能する正規表現はありますか?

4

4 に答える 4

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}
 )
)$

または、ASP.NETバリデーターで詳細な正規表現を使用できない場合:

^(?:^(?:(?:(?:(?:(?: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}))$)$

これらは、1桁の月/日で先行ゼロを許可しますが、必須ではありません。それが不要な場合は、のすべてのインスタンスをに置き換えて0?ください0

于 2010-11-27T12:56:51.747 に答える
2

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

于 2010-11-27T12:14:25.680 に答える
1

うるう年を検証するロジックが必要なため、を使用することを検討してCustomValidatorください。私はこれを比較的迅速にまとめましたが、うまくいけば、あなたはその考えを理解するでしょう。

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;
    }
}
于 2010-11-27T06:41:43.170 に答える
0

ビットワイズが言うように、クライアントサイドJSはこれを行う方法であり、トムの気が遠くなるような投稿のような恐ろしい正規表現ではありません。作業用マシンにかなり整頓された日付バリデーターがあります。月曜日に投稿します。

アプリで何らかの検証の失敗の問題が発生した場合、その正規表現を解読しようとする悪夢を想像できますか?

于 2010-11-27T13:40:11.080 に答える