需要正则表达式来验证 dd-MMM-yyyy 格式的日期。

12

我不是正则表达式的专家,所以需要你的帮助。我想验证日期是否符合“dd-MMM-yyyy”的格式,即07-Jun-2012。我正在使用asp.net中的RegularExpressionValidator。

有人可以帮我提供表达式吗?

感谢您分享您的时间。


1
数据从哪里来 - 如果是用户输入,最好使用日期字段进行完全验证 - 因为正则表达式无法捕获正确的2月29日等日期。 - mmmmmm
你只需要语法上有效的日期,还是需要实际上有效的日期?例如,正则表达式是否应该拒绝30-Feb-2012这样的无效日期? - BunjiquoBianco
我只需要语法上有效的日期,尽管如果正则表达式完全验证它会更好。 - IrfanRaza
我正在使用带有jQuery日期选择器的文本框来获取日期。 - IrfanRaza
你有查看相关问题部分吗? - Salman A
显示剩余2条评论
8个回答

26

使用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


很高兴看到测试正则表达式的链接。 - Vishal Jagtap
嗨,马克,上面的表达式非常酷,我必须搜索和匹配2018年1月1日,我的意思是当我们有ST、ND、NTH或TH与月份的日期时。 - Jot Dhaliwal

11

日期正则表达式不包含前导零。

^\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"。 - Hans Kesting

3

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

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

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

2
接受的解决方案允许将“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日等。


我可以搜索月份的第1、2、4、3天吗? - Jot Dhaliwal
我不太确定你的意思 @JotDhaliwal - buddamus

2
"\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.yyyy, d-MMM, mm.dd.yyyy

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

包括代码/解决方案的简要介绍会使答案更完整! - Paresh Mayani

0
另一个想法是尝试这个(类似于user1441894的想法):
var x = DateTime.Parse("30-Feb").GetDateTimeFormats();

我昨天学会了使用它(用于不同的目的)。因此,尝试捕获该语句以处理日期的有效性/无效性:)


-1
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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接