如何验证字符串是否采用 YYYY-MM-DD 形式 (C#)
How to validate a string is in YYYY-MM-DD form (C#)
我在 SO 上看到的大多数方法都涉及验证 C# 日期对象,这不是我想要做的。对于我正在处理的内容,用户将输入一个格式为 1999-02-23 的字符串。我想验证他们输入的字符串是否遵循 YYYY-MM-DD 格式。我提出的解决方案似乎过于复杂。
尝试
var stringToValidate = "1999-02-23";
DateTime dt;
bool ok = DateTime.TryParseExact(
stringToValidate,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt
);
免责声明:@AlexD - 有正确的方法来验证日期。你不能对Regex
做同样的事情,因为calculations are required for leap years。
不过,引用原题:
Most of the ways I have seen on SO have involved validating a C# date
object which is not what I want to do.
由于问题 也被标记为 regex
,这里有几种方法可以获得不同程度的 部分 成功Regex
:
与 DateTime.TryParseExact()
:
相比,FEB / APR / JUN / SEP / NOV 无法生成有效的 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
);
与闰年的 DateTime.TryParseExact()
相比,FEB 无法生成有效的 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
);
希望以上内容与您尝试过的不同。 ;)
我在 SO 上看到的大多数方法都涉及验证 C# 日期对象,这不是我想要做的。对于我正在处理的内容,用户将输入一个格式为 1999-02-23 的字符串。我想验证他们输入的字符串是否遵循 YYYY-MM-DD 格式。我提出的解决方案似乎过于复杂。
尝试
var stringToValidate = "1999-02-23";
DateTime dt;
bool ok = DateTime.TryParseExact(
stringToValidate,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt
);
免责声明:@AlexD - 有正确的方法来验证日期。你不能对Regex
做同样的事情,因为calculations are required for leap years。
不过,引用原题:
Most of the ways I have seen on SO have involved validating a C# date object which is not what I want to do.
由于问题 也被标记为 regex
,这里有几种方法可以获得不同程度的 部分 成功Regex
:
与 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
);
与闰年的 DateTime.TryParseExact()
相比,FEB 无法生成有效的 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
);
希望以上内容与您尝试过的不同。 ;)