【问题标题】:Regular Expression validator for date format DD/MMM/YYYY日期格式 DD/MMM/YYYY 的正则表达式验证器
【发布时间】:2011-05-18 08:23:24
【问题描述】:
<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>

我正在使用这个正则表达式验证器作为日期。对于 2010 年 2 月 12 日或 2010 年 2 月 12 日,它没有给出错误。我严格想要 12/FEB/2010 格式。此正则表达式 ii\on 不适用于 29/FEB/2010 等日期。需要做出哪些改变。

【问题讨论】:

    标签: .net


    【解决方案1】:

    如果您想验证所有可能的情况(例如 30/FEB),这将是一个非常复杂的正则表达式。

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

    [编辑]

    对于评论中的问题:

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

    【讨论】:

    • 那么需要在我的正则表达式中进行哪些更改,它也检查 30 FEB
    • 是 ^((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]) (一月|二月|三月|五月|四月|七月|六月|八月|OCT|SEP|NOV|DEC) ((1[6-9]|[2-9]\d)\d{2})$ 这也是适用于 2 月 30 日等日期的正则表达式。 bt 它的格式是 DD MMM YYYY。你能把它改成 DD/MMM/YYYY 格式吗
    • 抱歉,2 月 29 日不是 2 月 30 日
    • @user698047 - ^((31(?! (FEB|APR|JUN|SEP|NOV)))|((30|29)(?!FEB))|(29(?=二月 (((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])/(一月|二月|三月|五月|四月|七月|六月|八月|十月|九月|十一月|十二月)/((1[6-9]|[2-9]\d)\d{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])/(一月|二月|三月|MAY|APR|JUL|JUN|AUG|OCT|SEP|NOV|DEC)/((1[6-9]|[2-9]\d)\d{2})$ 感谢您的支持跨度>
    【解决方案2】:

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

    这部分 ([\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 日)天数的任何问题。但是,我没有发现它与 Hans 在 cmets 中提出的“311apr}2011”相匹配——还有什么进一步的评论吗?

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

    【讨论】:

    • 是的,你是正确的。我想要更正确的一点。如果我输入 29/FEB/2011,这个正则表达式不起作用。实际上这个日期是不存在的。所以它必须给出错误。
    • @user:这不是正则表达式的用途......您正在尝试在螺丝上使用锤子。
    • 还有更多问题:它匹配“311apr}2011”,因为[] 需要是()
    • ^((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]) (一月|二月|三月|五月|四月|七月|六月|八月| OCT|SEP|NOV|DEC) ((1[6-9]|[2-9]\d)\d{2})$ 这是我发现的正则表达式,它也检查像 2 月 30 日这样的日期,但它的是 dd MMM YYYY。我将其更改为 DD/MMM/YYYY bt 对我不起作用。你能把它改成 DD/MMM/YYYY 格式吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2012-01-03
    • 2023-04-07
    • 2013-07-04
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多