【发布时间】:2011-01-22 08:16:44
【问题描述】:
我需要在 C# 中使用正则表达式验证日期格式。
格式如下:"YYYYMMDD"
【问题讨论】:
我需要在 C# 中使用正则表达式验证日期格式。
格式如下:"YYYYMMDD"
【问题讨论】:
正则表达式不适合此任务。例如,很难编写一个匹配有效日期“20080229”但不匹配无效日期“20100229”的正则表达式。
您应该将DateTime.TryParseExact 与格式字符串"yyyyMMdd" 一起使用。这是一个例子:
string s = "20100229";
DateTime result;
if (!DateTime.TryParseExact(
s,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal,
out result))
{
Console.WriteLine("Invalid date entered.");
};
【讨论】:
好的,这是我构建过的最漂亮的正则表达式。这占了自 1582 年引入闰年以来的所有闰年。它还每四世纪处理一次非飞跃。例如,1600 是闰,但 1700 不是,尽管它可以被四整除。我在 1582 到 9999 之间的所有日子里都对此进行了测试。
var yyyymmdd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))$");
另一个使用破折号的版本
var yyyyDashMmDashDd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:[01][0-9]|2[0-8])))))$");
我喜欢这几乎适用于所有语言,只要它们支持正则表达式。虽然可以说使用特定语言的日期解析器更明智,但我认为这显示了正则表达式的强大和优雅。
如果你想看的话,这里有一个 image 的 Regexper 中带有斜线的模式。
【讨论】:
考虑使用DateTime.TryParseExact 来验证日期。 您可以使用该方法同时验证和读取 DateTime 值。
例如:
DateTime dateValue;
if (DateTime.TryParseExact(dateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
{
//Parsed Successfully
}
【讨论】: