Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于检测yyyy-MM-dd的正则表达式_C#_Asp.net_Regex_Validation - Fatal编程技术网

C# 用于检测yyyy-MM-dd的正则表达式

C# 用于检测yyyy-MM-dd的正则表达式,c#,asp.net,regex,validation,C#,Asp.net,Regex,Validation,我使用asp.net 4和c# 我需要使用类型验证的网络控件,即RegularExpressionValidator来检测不是yyyy-MM-dd格式(字符串)的文本框中输入的数据 知道如何编写正则表达式来应用此控件吗 谢谢正则表达式\d\d\d-\d\d-\d\d应该可以做到这一点。这里有一个可能的正则表达式: ^\d{4}-((0\d)|(1[012]))-(([012]\d)|3[01])$ 注意:这将防止月份>12天>31天,但不会检查具体月份的长度(即不会阻止2月30日或4月31日)

我使用asp.net 4和c#

我需要使用类型验证的网络控件,即
RegularExpressionValidator
来检测
不是yyyy-MM-dd格式(字符串)的文本框中输入的数据

知道如何编写正则表达式来应用此控件吗


谢谢

正则表达式
\d\d\d-\d\d-\d\d
应该可以做到这一点。

这里有一个可能的正则表达式:

^\d{4}-((0\d)|(1[012]))-(([012]\d)|3[01])$
注意:这将防止月份>12天>31天,但不会检查具体月份的长度(即不会阻止2月30日或4月31日)。你可以写一个正则表达式来实现这一点,但它会相当长,2月29日总是会给你带来正则表达式方面的问题

我想说,如果您需要这种细粒度验证,最好使用日期库解析日期;正则表达式不是适合你的工具。这个正则表达式应该足以进行基本的预验证

我在这一年也很宽容;只是检查一下是不是四位数。但是,如果你想要某种形式的理智检查(即在一定范围内),添加它应该不会太难。例如,如果只想匹配本世纪的日期,可以将正则表达式开头的
\d{4}
替换为
20\d{2}
。同样,尝试在regex中以过高的精度验证日期是很困难的,您应该使用日期解析器,但是您可以很容易地获得基本的世纪级匹配,以防止用户输入任何真正愚蠢的内容

最后,我将
^
$
放在字符串的末尾,以便在用户输入有效日期和额外字符时无法匹配。(您可能还需要为此添加一个字符串长度验证器)


希望能有所帮助。

上面Spudley的回答允许每天和每月使用00

我修正了它:

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

注意:这两个表达式都不检查一个月中无效的天数,例如非闰年的04/31、06/31或02/29。

我想在Spudley的答案中添加一点变化:

^\d{4}$|^\d{4}-((0?\d)|(1[012]))-(((0?|[12])\d)|3[01])$
因此,您可以使用日期,如2013-5-5(月份和日期不必为零,但可以使用)


希望有帮助。

ISO 8601结构化日期的另一个实现:

^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}.?\d{0,}$

它没有那么严格,并且会接受不正确的日期,但它应该验证它是否遵循ISO 8601结构,即使该日期不存在。对于任何具有基本正则表达式理解的人来说,它也应该相当容易理解

如果确实要确保日期正确,并使用它,请对其运行DateTime.TryParse()

这是
yyyy-MM-dd
格式的正则表达式

对于
yyyy/MM/dd
,您可以将
-
替换为
\/

测试工作完美

(19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])
马赫数结果:


1999年9月12日

@Daniel原始海报似乎对日期是否无效不感兴趣。他当然感兴趣,他谈到了格式
yyyy-MM-dd
,这意味着字符串是一个有效日期。@Daniel提供了一个不允许无效日期而不是向下投票的格式。除了正则表达式之外,还可以检查日期的有效性吗?闰年呢?@Kristof@Spudley这是可能的,因为我使用正则表达式库中的各种正则表达式完成了它。其中很多都考虑了闰日。您遇到了一个问题,决定使用正则表达式来解决它。。。。现在你有两个…正则表达式对于格式来说很好,但是在正则表达式中验证它是一个实际日期是非常困难的(你如何处理闰年,等等?)-你没有指定你是否需要它。如果是,您最好创建一个CustomValidator,并使用
Date.parse
(如果不是DateTime,则返回NaN)客户端测试失败,以及
DateTime.TryParse
服务器端。您也可以使用类似这样的方法:\d{4}-\d{1,2}-\d{1,2}您是对的,但这也允许永远不存在的0000年,计数从公元前1年开始,而前一年是公元前1年(当时没有概念化零),这就是为什么千禧年从2001年开始,而不是像许多人庆祝的那样从2000年开始。
(19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])