用于验证日期时间格式的正则表达式(MM/DD/YYYY)[重复]
Posted
技术标签:
【中文标题】用于验证日期时间格式的正则表达式(MM/DD/YYYY)[重复]【英文标题】:regular expression to validate datetime format (MM/DD/YYYY) [duplicate] 【发布时间】:2013-02-18 05:45:08 【问题描述】:我正在尝试验证日期时间格式 MM/DD/YYYY。这是我正在尝试的代码,请帮忙。
function ValidateDate(testdate)
var Status
var reg = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d2))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d2))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d2))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g;
if (!reg.test(testdate))
Status = false;
return Status;
【问题讨论】:
参考devnetwork.net/viewtopic.php?f=29&t=13795 你的代码到底有什么问题? 正则表达式有问题 尝试使用正则表达式验证日期是一种快速发疯的好方法——将其结构化为接受每个月的所有天数,但不接受每个月的无效天数会导致组合爆炸。这样想......你想拒绝任何一个月的 32 号,几个月的 31 号,包括任何一年的 06/31,你必须每年接受 02/28,但大多数年份都拒绝 02/29,虽然如果年份可以被 4 整除,但如果可以被 100 整除,则您应该接受它,但如果年份可以被 400 整除,那么 02/29 就可以了。 【参考方案1】:使用http://jsregex.com/(有很多)或更好的单元测试之类的工具尝试您的正则表达式。
对于简单的验证:
function validateDate(testdate)
var date_regex = /^\d2\/\d2\/\d4$/ ;
return date_regex.test(testdate);
在您的情况下,为了验证 (MM/DD/YYYY),年份介于 1900 和 2099 之间,我会这样写:
function validateDate(testdate)
var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d2$/ ;
return date_regex.test(testdate);
【讨论】:
我进行了编辑以添加更复杂的验证。 @Supreet:这只是弱验证。您仍然需要在服务器端进行彻底的验证。 @nhahtdh : 如何进行服务器端检查以验证格式? @Supreet:如果您使用的是 PHP:php.net/manual/en/function.checkdate.php 您的简单正则表达式模式正是我想要的。谢谢【参考方案2】:标记的答案是完美的,但在一种情况下,dd 和 mm 实际上是个位数。在这种情况下,以下正则表达式是完美的:
function validateDate(testdate)
var date_regex = /^(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d2$/ ;
return date_regex.test(testdate);
【讨论】:
【参考方案3】:基于此
dd-mm-yy
我把原来的修改成这样:
^(?:(?:(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec))(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d2)$|^(?:(?:0?2|(?:Feb))(\/|-|\.)(?:29)\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d2)$
test the regex here
【讨论】:
【参考方案4】:var pattern = new RegExp((0|1)[0-9]\/[0-3][0-9]\/(19|20)[0-9]2);
if(!testdate.match(pattern))
return false;
else return true;
【讨论】:
在我看来,使用(0[0-9]|1[012])
更好地检查MM
。
这将给出语法错误。即使你修复它,正则表达式也比 OP 更糟糕。
@Dream Eater 你是对的
这个正则表达式允许日期和月份为00
,这是无效的。【参考方案5】:
您可以查看this 链接,我希望这对我有很大帮助。
如果您在 Java 代码中使用上述链接中给出的正则表达式,请使用以下正则表达式
"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d$"
正如我在您的示例中注意到的那样,您使用的是 js 函数,然后使用正则表达式
"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"
这将匹配 1900-01-01 到 2099-12-31 之间的 mm/dd/yyyy 格式的日期,可选择四个分隔符。 并且不要忘记
return regex.test(testdate);
【讨论】:
【参考方案6】:在这种情况下,验证日期 (DD-MM-YYYY) 或 (DD/MM/YYYY),年份介于 1900 和 2099 之间,例如使用月份和日期验证
if (!Regex.Match(txtDob.Text, @"^(0[1-9]|1[0-9]|2[0-9]|3[0,1])([/+-])(0[1-9]|1[0-2])([/+-])(19|20)[0-9]2$").Success)
MessageBox.Show("InValid Date of Birth");
txtDob.Focus();
【讨论】:
【参考方案7】:虽然很长,但是很棒:
new RegExp(/(?=\d)^(?:(?!(?:10\D(?:0?[5-9]|1[0-4])\D(?:1582))|(?:0?9\D(?:0?[3-9]|1[0-3])\D(?:1752)))((?:0?[13578]|1[02])|(?:0?[469]|11)(?!\/31)(?!-31)(?!\.31)|(?:0?2(?=.?(?:(?:29.(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:(?:\d\d)(?:[02468][048]|[13579][26])(?!\x20BC))|(?:00(?:42|3[0369]|2[147]|1[258]|09)\x20BC))))))|(?:0?2(?=.(?:(?:\d\D)|(?:[01]\d)|(?:2[0-8])))))([-.\/])(0?[1-9]|[12]\d|3[01])\2(?!0000)((?=(?:00(?:4[0-5]|[0-3]?\d)\x20BC)|(?:\d4(?!\x20BC)))\d4(?:\x20BC)?)(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d)0,2(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d)1,2)?$/);
【讨论】:
虽然代码通常不言自明,但仅包含代码且没有文字解释的答案会被标记为审核队列。您可以通过添加一两句解释来避免这种情况。 没有解释它包含什么功能,让人迷惑。以上是关于用于验证日期时间格式的正则表达式(MM/DD/YYYY)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何根据服务器日期格式为 jQuery UI datepicker 设置 dateFormat?
用于验证日期时间格式的正则表达式(MM/DD/YYYY)[重复]
编写一个程序, 接收用户录入的日期信息并且将其显示出来. 其中, 输入日期的形式为月/日/年(mm/dd/yy), 输出日期的形式为年月日(yy.mm.dd)。
编写一个程序, 接收用户录入的日期信息并且将其显示出来. 其中, 输入日期的形式为月/日/年(mm/dd/yy), 输出日期的形式为年月日(yy.mm.dd)。