【问题标题】:Need regular expression for validating date in dd-MMM-yyyy format需要正则表达式来验证 dd-MMM-yyyy 格式的日期
【发布时间】:2012-06-07 11:47:57
【问题描述】:

我不是编写正则表达式的专家,所以需要你的帮助。我想以“dd-MMM-yyyy”格式验证日期,即 2012 年 6 月 7 日。我在 asp.net 中使用 RegularExpressionValidator。

谁能帮我提供一下表达方式?

感谢您分享您的时间。

【问题讨论】:

  • 数据来自哪里 - 如果用户输入肯定更好地使用日期字段来完全验证它 - 因为正则表达式不会捕获正确的 2 月 29 日等
  • 您只想要语法上有效的日期还是想要实际有效的日期?例如,正则表达式是否应该拒绝 2012 年 2 月 30 日,因为这是一个不可能的日期?
  • 我只需要语法上有效的日期,尽管如果正则表达式完全验证它会更好。
  • 我正在使用带有 jquery datepicker 的文本框来获取日期。

标签: asp.net regex


【解决方案1】:

使用 DatePicker 可能是最好的方法。但是,由于这不是您所要求的,这里有一个选项(尽管它区分大小写):

^(([0-9])|([0-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$

另外,这里有一个可以轻松测试正则表达式的地方:http://www.regular-expressions.info/javascriptexample.html

【讨论】:

  • 很高兴看到测试正则表达式的链接
  • 嗨,马克,上面的表达式很酷,我必须搜索并匹配 2018 年 1 月 1 日,我的意思是当我们有 ST 、 ND、 NTH 或 TH 的日期时
【解决方案2】:

正则表达式没有前导零。

^\d{1,2}-[a-zA-Z]{3}-\d{4}$

更新正则表达式,当天前导零。

^\d{2}-[a-zA-Z]{3}-\d{4}$

【讨论】:

  • \d 表示任何数字,因此第一个接受“0”和“88”作为日期。 [a-zA-Z]{3} 也匹配“xYz”。
  • 非常感谢@Leonov Mikhail
【解决方案3】:

这不是正则表达式,但您可以使用内置 DateTime.TryParseExact 函数来验证您的日期时间字符串

DateTime dateTime;
string toValidate = "01-Feb-2000";

bool isStringValid = DateTime.TryParseExact(
    toValidate,
    "dd-MMM-yyyy",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out dateTime);

【讨论】:

    【解决方案4】:

    公认的解决方案允许将“00”作为日期,因此这里有一个解决方法:

    ^(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$
    

    注意事项/例外情况:

    1.注意区分大小写的问题。例如。 'DEC' 不会通过,而 'Dec' 会通过。您可能希望在测试之前将正则表达式字符串和测试字符串转换为小写(如果您的应用程序允许)。

    2.这不会捕获不存在的日期,例如 2 月 30 日、6 月 31 日等。

    【讨论】:

    • 我可以搜索 1st 吗? 2nd , 4th, 3rd 也是一个月中的几天?
    • 我不太清楚你的意思@JotDhaliwal
    【解决方案5】:
    "\d{4}\d{2}\d{2}|\d{2}/\d{2}/\d{4}|\d{2}.\d{2}.\d{4}|\d{2}\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)|(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2}\-\d{4}|\d{4}-\d{2}-\d{2}"
    

    这些格式是mm.dd.yyyyd-MMMmm.dd.yyyy

    【讨论】:

      【解决方案6】:

      另一个想法是尝试这个(类似于 user1441894 的想法):

      var x = DateTime.Parse("30-Feb").GetDateTimeFormats();
      

      我昨天学会了使用它(用于不同的目的)。所以try-catch这个语句来处理日期的有效性/无效性:)

      【讨论】:

        【解决方案7】:
        "^(([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])[-]([JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC])[-](d{4}))$"
        

        【讨论】:

        • 包含关于代码/解决方案的简要说明将使这个答案成为一个完整的答案!
        【解决方案8】:
        using System.Text.RegularExpressions
        
        private void fnValidateDateFormat(string strStartDate,string strEndDate)
        {
            Regex regexDt = new Regex("(^(((([1-9])|([0][1-9])|([1-2][0-9])|(30))\\-([A,a][P,p][R,r]|[J,j][U,u][N,n]|[S,s][E,e][P,p]|[N,n][O,o][V,v]))|((([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\\-([J,j][A,a][N,n]|[M,m][A,a][R,r]|[M,m][A,a][Y,y]|[J,j][U,u][L,l]|[A,a][U,u][G,g]|[O,o][C,c][T,t]|[D,d][E,e][C,c])))\\-[0-9]{4}$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-8]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][1235679])|([13579][01345789]))$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-9]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][048])|([13579][26]))$)");
        
            Match mtStartDt = Regex.Match(strStartDate,regexDt.ToString());
            Match mtEndDt   = Regex.Match(strEndDate,regexDt.ToString());
            if (mtStartDt.Success && mtEndDt.Success)
            {
                    //piece of code
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-09
          • 1970-01-01
          • 2012-01-03
          • 2023-04-07
          • 2013-07-04
          • 2013-11-15
          相关资源
          最近更新 更多