使用正则表达式验证日期

时间:2015-04-25 10:53:44

标签: javascript regex

日期格式为2015/04/25 我正在尝试

^\d{4}\/\d{2}\/\d{2}$

它的工作正常,但我想验证月份应该小于12,而日期少于31

我试过这个

^\d{4}\/(\d{2}\<[12])\/\d{2}$

但它没有用。

PS:我在正则表达式中非常棒。

3 个答案:

答案 0 :(得分:3)

您可以使用

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

说明:

  • \d{4}任意四位数字
  • (0\d|1[0-2]) 0(任何数字)或1(0至2),00 to 0910-12
  • ([0-2]\d|3[01])(0到2)(任何数字)或3(0或1),即00 to 2930 or 31

修改1:如果您想仅在01-12匹配几个月而01-31仅匹配一天(没有00),您可以使用:

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

Edit2:如果您希望严格验证日期,请使用@Wayne建议的explodecheckdate ..因为它还包括闰年验证。< / p>

请参阅Demo

答案 1 :(得分:1)

正如jeroen在上面指出的那样,最好的解决方案是使用explode和checkdate函数的组合。正则表达式不会捕获从未发生的日期。

$exploded = explode("/", $date);
if(checkdate($exploded[1], $exploded[2], $exploded[0])){
   //Valid date.
}

PS,您可能还想检查$ explosion数组中的元素数量,看看您期望三个字符串。

答案 2 :(得分:1)

这里是使用@karthik manchala所显示的相同原理的扩展版本

^((\d{4}\/(0[469]|11)\/(0[1-9]|1\d|30))|(\d{4}\/(0[13578]|1[02])\/([0-2]\d|3[01]))|(\d{4}\/(02)\/(0[1-9]|[12]\d)))$

它将过滤30和31以及2月29以上的所有内容。它不会在2月份识别何时使用28和29。

如果你想捕获闰年,你可以轻松地做到这一点,如果它是近期的最近日期或日期,因为它可以被4整除,你可以捕获2000年,2004年,2008年,2012年等但规则不一致