正则表达式 - 日期(mm / dd / yyyy)格式(JavaScript)

时间:2017-02-28 19:05:16

标签: javascript regex

正则表达式的格式为 mm / dd / yyyy。

我的current regex目前有一个小问题,我无法指出。我可以用有效月份,闰年和年份范围验证mm / dd / yyyy。虽然写的年份是'2016asdf',但它仍接受该值。

应遵循的规则是:

  • 仅允许有效日期
  • 如果是闰年,可以计算2月29日
  • 年份值范围为1900 - 2099

有效值:

  

2016年12月31日

     

1900年1月15日

     

02/29/2016(自2016年起是闰年)

无效值:

  

1/01/1900(因格式为'mm'而不是'm')

     

01/32/1900(因为没有这样的日期)

     

19/22/1900(因为没有这样的月份)

     

03/01/2100(超过年限)

     

02/29/2017(2017年以来不是闰年)

5 个答案:

答案 0 :(得分:4)

你弄错了。这不应该通过正则表达式完成,事实上,它并不意味着这样做。为此,您需要执行以下步骤:

1-通过Regex检查模式

2-验证日期。

您正在寻找的模式是:

// $result_i = mysqli_query( $conn, $sql_i );  // remove this line

// query executed first time, record added, NO more queries here
if ( mysqli_query( $conn, $sql_i ) ) {
    redirect_to( "profile_image_fetch_image.php?id=$S_id" );
} else {
    echo "Error: " . $sql_i . "<br>" . mysqli_error( $conn );
}

看一下这个模式:http://regexr.com/3fe3s

最后,如果你想检查日期是否是有效日期(在检查模式后)。

以下是整个方法:

var pattern = /(0\d{1}|1[0-2])\/([0-2]\d{1}|3[0-1])\/(19|20)\d{2}/

答案 1 :(得分:0)

每个|都需要^和$所以正则表达式应该是:

^((0 [13578] | 1 [02])31 / [0-9] {2} [/]。)$ | ^((01 | 0 [3-9] | 1 [1- 2])/./ [0-9] {2})$ |。^((0 [1-9] | 1 [0-2])/./ [0-9] {2})$。| ^((02)[/] 29 /.)$

Working expression

答案 2 :(得分:0)

有一个非常彻底的答案here。您可以阅读使用该方法的解释和注意事项。

  

31个月

     

(0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2}

     

30天的月份

     

(0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2}

     

2月1 - 8日始终有效

     

(02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2}

     

2月29日在闰年也有效

     

(02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000)

     

这意味着如果你把它们放在一起就是这个:

     

((0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2})|((0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2})|((02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))

     

这个版本有点短,但有点难以理解。

     

((0[13578]|1[02])[\/.]31[\/.](18|19|20)[0-9]{2})|((01|0[3-9]|1[1-2])[\/.](29|30)[\/.](18|19|20)[0-9]{2})|((0[1-9]|1[0-2])[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))

     

这些脚本很长且不可维护。应该很清楚   这不是一个好主意,但它是可能的。

     

注意事项:

     
      
  • 范围1800-2099(可以添加更多,但不需要太多困难,但需要在4-6个不同的地方进行更改)
  •   
  • 需要2个数字的月份和日期(严格性可以从~8个地方的表达中删除)
  •   
  • [/。]作为分隔符(8个地方)
  •   
  • Hasn未经过测试(我们可以针对所有数字组合进行检查,并与avascript日期函数进行比较?[证明我们正在重新发明轮子])
  •   

答案 3 :(得分:0)

我会尝试this
^02\/(?:[01]\d|2\d)\/(?:19|20)(?:0[048]|[13579][26]|[2468][048])|(?:0[13578]|10|12)\/(?:[0-2]\d|3[01])\/(?:19|20)\d{2}|(?:0[469]|11)\/(?:[0-2]\d|30)\/(?:19|20)\d{2}|02\/(?:[0-1]\d|2[0-8])\/(?:19|20)\d{2}$

const regex = /^02\/(?:[01]\d|2\d)\/(?:19|20)(?:0[048]|[13579][26]|[2468][048])|(?:0[13578]|10|12)\/(?:[0-2]\d|3[01])\/(?:19|20)\d{2}|(?:0[469]|11)\/(?:[0-2]\d|30)\/(?:19|20)\d{2}|02\/(?:[0-1]\d|2[0-8])\/(?:19|20)\d{2}$/

const testData = [
  '02/02/1904',
  '02/12/2008',
  '02/29/2012',
  '02/29/2013',
  '06/31/2013',
  '01/31/2013',
  '02/02/1916',
  '02/02/2020',
  '02/02/2024',
  '02/02/2036',
  '02/02/1952',
  '02/02/2056',
  '01/01/2256',
  '02/29/2000',
  '02/29/2100',
  '02/29/1900',
  '02/29/1200',
  '02/29/2400'
]

for (let date of testData) {
  console.log(`${date} ${regex.test(date)}`)
}

答案 4 :(得分:0)

它验证这些格式:

<块引用>
  • YYYY-DD-MM
  • YYYY/DD/MM
  • YYYY.DD.MM
  • YYYY.0M.0D
  • YYYY/0D/0M
  • YYYY-0D-0M
  • YYYY-D-M
  • YYYY.D.M
  • YYYY/D/M 等
/(((19\d{2}|20[0-9]{2}))(\/|\.|\-)(0?[1-9]|1[0-9]|2[0-9]|3[0-1])(\/|\.|\-))(0[0-9]$|1[0-2]$|[0-9]$)/gm