3

我们需要与 asp.net asp:RegularExpressionValidator 一起使用的正则表达式的帮助,以验证 MMddyy 格式的日期。我们面临的问题是闰年。问题是是否可以通过正则表达式验证它只接受有效的闰年日期,例如 02/29/2008 是有效日期,但 02/29/2010 不是有效日期。

任何与“asp:RegularExpressionValidator”一起使用的正则表达式?

4

4 回答 4

15

好的,您要求使用正则表达式。这里是。我认为很明显为什么用正则表达式验证日期不是一个好主意:

首先,冗长的注释版本至少使理解这个野兽成为可能:

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

这些允许但不需要在个位数的月份/天数中使用前导零。如果您不希望这样,请将 的所有实例替换0?0

于 2010-11-27T12:56:51.747 回答
2

如果服务器端不是一个选项,您将不得不使用 JavaScript。试试这里发布和解释的代码。它确定 02/29/2010 无效并且 02/29/2008 有效。必要时使用 CustomValidator 调用 JavaScript 函数。

于 2010-11-27T12:14:25.680 回答
1

Since you need logic to validate leap years, consider using a CustomValidator. I put this together relatively quickly, but hopefully you'll get the idea.

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 是执行此操作的方法,而不是 Tom 令人难以置信的帖子中的可怕正则表达式。我的工作机器上有一个非常整洁的日期验证器,我将在星期一发布。

如果您的应用程序遇到某种验证失败的问题,您能想象尝试破译该正则表达式的噩梦吗?

于 2010-11-27T13:40:11.080 回答