日期格式DD / MMM / YYYY的正则表达式验证器

时间:2011-05-17 06:59:32

标签: .net

<asp:TextBox ID="txtDob" runat="server" MaxLength="100" CssClass="textbox2" size="10"  />
<ajax:TextBoxWatermarkExtender ID="txtWEDOB" WatermarkText="DD/MON/YYYY" TargetControlID="txtDob" runat="server" />
<asp:RegularExpressionValidator ID="rfv" runat="server" ControlToValidate="txtDob" SetFocusOnError="true" 
ValidationExpression="^(3[0-1]|2[0-9]|1[0-9]|0[1-9])[\s{1}|\/|-](Jan|JAN|Feb|FEB|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)[\s{1}|\/|-]\d{4}$"  
Display="None" ValidationGroup="search" ErrorMessage="Please enter correct date">
</asp:RegularExpressionValidator>

我正在使用这个正则表达式验证器来表示日期。它不会像12-FEB-2010或2010年2月12日那样给出错误。我严格要求12 / FEB / 2010格式。此定期expressii \ on不适用于29 / FEB / 2010之类的日期。需要做出哪些改变。

2 个答案:

答案 0 :(得分:0)

如果要验证所有可能的情况(例如30 / FEB),那么正则表达式将非常复杂。

你需要30个月的子表达式,你需要一个月表达31天的子表达式,最有趣的是2月和闰年。我认为使用正则表达式不是一个好主意。

[编辑]

评论中的问题:

^((31(?! (FEB|APR|JUN|SEP|NOV)))|((30|29)(?! FEB))|(29(?= FEB (((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])/(JAN|FEB|MAR|MAY|APR|JUL|JUN|AUG|OCT|SEP|NOV|DEC)/((1[6-9]|[2-9]\d)\d{2})$

答案 1 :(得分:0)

我假设你已经从其他地方剪切并粘贴了这个正则表达式?

此部分([\s{1}|\/|-])是您的问题所在。这允许空格(\ s)和连字符( - ),以及/字符。

它应该是\/。所以你现在的正则表达式

"^(3[0-1]|2[0-9]|1[0-9]|0[1-9])[\s{1}|\/|-](Jan|JAN|Feb|FEB|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)[\s{1}|\/|-]\d{4}$

变为

"^(3[0-1]|2[0-9]|1[0-9]|0[1-9])\/(Jan|JAN|Feb|FEB|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)\/\d{4}$

编辑:我已经解决了这个答案中“新”正则表达式中的拼写错误(()。

请注意,会解决有关不同月份(例如2月30日)天数的任何问题。但是我没有发现它与汉斯在评论中提出的“311apr} 2011”相匹配 - 还有任何进一步的评论吗?

这正确地解决了您的问题。我同意下面的评论,正则表达式是一个可靠的日期验证工具,但我提供的答案,而不是试图给你一般的建议。