如何验证一个字符串是否为YYYY-MM-DD格式(C#)

6

我在 Stack Overflow 上看到的大部分方法都涉及到验证 C# 日期对象,这不是我想要做的。对于我正在处理的工作,用户将以格式为 1999-02-23 的字符串输入。我希望验证他们输入的字符串是否遵循 YYYY-MM-DD 的格式。我提出的解决方案似乎过于复杂。


1
DateTime.TryParseExact - juharr
只是挑剔一下,你想要验证字符串本身,还是验证字符串是否为有效日期(这是有区别的),或者实际上将其解析为 DateTime - Enigmativity
2个回答

13

尝试

var stringToValidate = "1999-02-23";
DateTime dt;
bool ok = DateTime.TryParseExact(
   stringToValidate,
   "yyyy-MM-dd",
   CultureInfo.InvariantCulture,
   DateTimeStyles.None,
   out dt
);

这正是我在寻找的解决方案。谢谢! - tonyleMill

2
免责声明:@AlexD - 有正确的日期验证方式。你不能使用正则表达式进行验证,因为闰年需要计算。
然而,引用自原问题:
大多数我在SO上看到的方法都涉及验证C#日期对象,这不是我想要做的。
由于问题还被标记为regex,这里有一些使用正则表达式获得不同程度部分成功的方法:
FEB / APR / JUN / SEP / NOV与DateTime.TryParseExact()比较时无法产生有效的DateTime:
// single line Regex, formatted below for readability:
// "\d{3}[1-9]-(0[1-9]|1[012])-(0[1-9]|1\d|2\d|3[01])"
var regexSimple = new Regex(
    @"
        # DateTime.MinValue => '0001-01-01'
        \d{3}[1-9]
        - 
        (0[1-9] | 1[012])
        -
        (0[1-9] | 1\d | 2\d | 3[01])
    ",
    RegexOptions.Compiled
    | RegexOptions.IgnorePatternWhitespace
);

FEB在闰年与DateTime.TryParseExact()进行比较时无法生成有效的DateTime。
// single line Regex, formatted below for readability:
// "\d{3}[1-9]-(([0][13578]-(0[1-9]|1[012]|2\d|3[01]))|([0][469]-(0[1-9]|1[012]|2\d|30))|(02-(0[1-9]|1[012]|2[0-8]))|(11-(0[1-9]|1[012]|2\d|30))|(12-(0[1-9]|1[012]|2\d|3[01])))"
var regexAllButFeb = new Regex(
    @"
        # DateTime.MinValue => '0001-01-01'
        \d{3}[1-9]
        - 
        (
            # JAN / MAR / MAY / JUL/ AUG
            ([0][13578]-(0[1-9] | 1[012] | 2\d | 3[01]))
            | 
            # APR / JUN / SEP / NOV
            ([0][469]-(0[1-9] | 1[012] | 2\d | 30))
            |
            # FEB
            (02-(0[1-9] | 1[012] | 2[0-8]))
        #   or replace with [0-9] - ^^^^^
            |
            # NOV
            (11-(0[1-9] | 1[012] | 2\d | 30))
            |
            # DEC
            (12-(0[1-9] | 1[012] | 2\d | 3[01]))
        )
    ",
    RegexOptions.Compiled
    | RegexOptions.IgnorePatternWhitespace
);

希望上述内容不是您尝试过的相同的事情。;)

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