【问题标题】:Date validator/format日期验证器/格式
【发布时间】:2016-03-27 02:27:46
【问题描述】:

我正在尝试验证日期的格式,并在 C# 中验证等于或小于今天的日期我正在尝试使用正则表达式在 c# 中实现这一点。

我尝试支持的格式是 dd/mm/yyyy、dd-mm-yyyy、yyyy-mm-dd、yyyy/mm/dd。

var expressions = new List<Regex>();

expressions.Add(new Regex("^\\d{4}-((0\\d)|(1[012]))-(([012]\\d)|3[01])$"));
expressions.Add(new Regex("(((0|1)[1-9]|2[1-9]|3[0-1])\\/(0[1-9]|1[0-2])\\/((19|20)\\d\\d))$"));

return expressions;

有人能告诉我我在我的 reg ex 中做错了什么,并提出一个更好的方法来实现这一点。

【问题讨论】:

标签: c# regex validation date datetime


【解决方案1】:

没有必要为此使用正则表达式;您可以使用允许的格式作为参数调用DateTime.ParseExactDateTime.TryParseExact。与正则表达式不同,此方法还将确保用户提供的日期有效(例如,允许“2016-02-29”但不允许“2015-02-29”)。

string inputDate = "2015-01-01";
DateTime dt;

bool validDate = DateTime.TryParseExact(inputDate,
    new[] { "dd/MM/yyyy", "dd-MM-yyyy", "yyyy-MM-dd", "yyyy/MM/dd" },
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None,
    out dt);

Console.WriteLine(validDate ? dt.ToString("MM/dd/yyyy") : "Invalid date"); // 01/01/2015

【讨论】:

  • 没错。尝试解析 DateTime 比在这种情况下使用正则表达式要好得多。
  • 使用 DateTime.TryParse()。如果您使用 RegEx,那么某些月份的天数呢?闰年和 2 月 29 日呢?...
【解决方案2】:

这里有几个问题。

  1. 你的正则表达式在这里

    "^\\d{4}-((0\\d)|(1[012]))-(([012]\\d)|3[01])$"
    

    只能找到带有- 的日期格式,而不是带有/ 的日期格式(即1999-12-25 有效但1997/11/15 无效)。如果你想改变它,你应该使用

    "\\d{4}(-|\/)((0\\d)|(1[012]))(-|\/)(([012]\\d)|3[01])$" //^ removed, \/ added
    

    这将匹配 1999-12-25 和 1997/11/15(编辑:但也将匹配 1998/05-28!)

  2. 同样,你的正则表达式在这里

    "(((0|1)[1-9]|2[1-9]|3[0-1])\\/(0[1-9]|1[0-2])\\/((19|20)\\d\\d))$"
    

    只能匹配 12/11/1954,但不能匹配 12-11-1954。还有一些,因为你放了 (0|1)[1-9]|2[1-9],你的正则表达式不能匹配 10-11-1954。使用

    "((0|1)[0-9]|2[0-9]|3[0-1])(-|\/)(0[1-9]|1[0-2])(-|\/)(19|20)\\d\\d$"
    

改为

但是说真的,除非是必须的,否则用正则表达式解析(不是说比较)DateTime 值是一项艰巨的任务!您应该分别使用DateTime.TryParseDateTime.ParseTimeSpan 进行解析和比较。

【讨论】:

  • 您将匹配2015-12/21。最好将第二个(-|\/) 替换为\1(在“1.”部分)或\2(在“2.”中),以便RE 检查分隔符的使用是否一致。另外,我会使用([-\/]) 而不是` | ` 风格 - 只是个人喜好;同样使用[01] 而不是0|1
  • 其实,你是对的......将编辑我的答案。是的,重点是这是相当地狱般的任务。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2018-10-21
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2018-06-11
相关资源
最近更新 更多