繁体   English   中英

JavaScript正则表达式以匹配mm / dd / yyyy格式-仅限于数字输入

[英]JavaScript regular expression to match mm/dd/yyyy format - restrict to numeric input only

我正在尝试编写一些正则表达式来验证MM / DD / YYYY日期输入。 日期的每个部分都是一个单独的输入文本字段,由“ /”分隔,例如:

1985年 1 月16

日期为1985年1月16日。

我现在在只允许数字输入的地方使用它,使用replace()和简单的正则表达式很容易。 顺便说一句,正则表达式不是我的强项,我没有做太多,也许每两年一次或两次。

下面是我正在使用的代码以及我的replace()下面的一些psuedo-regex。 我很难将数字输入正则表达式与我要实现的日期格式正则表达式绑定在一起(在replace()下注释)

//MM  
$(this).keyup(function() {  
    //allow only numbers  
    this.value = this.value.replace(/[^0-9]/g, '');  

    //(0[1-9]|1[012])  
    //matching 01 (Jan) to 09 (Sep) to 10 (Oct) to 12 (Dec)  
});

//DD  
$(this).keyup(function() {
    //allow only numbers
    this.value = this.value.replace(/[^0-9]/g, '');

    //(0[1-9]|[12][0-9]|3[01])
    //matching 01-09, 10-19, 20-29, 30-31
    //(not worried about picking 31 in February)
});

//YYYY  
$(this).keyup(function() {
    //allow only numbers
    this.value = this.value.replace(/[^0-9]/g, '');

    //(\d{4})
    //really simple 4 digit, but don't really want 1245 as a valid year

    //a range from 1900-current year would be great
//( 1900-newDate().getFullYear() )
    //something like this possible?
);
(?:0[1-9]|1[0-2])/(?:0[1-9]|[12][0-9]|3[01])/(?:19|20)[0-9]{2}
  • 匹配01至12/01至31/1900至2099
  • 限制:2月31日(和类似项目)比赛
  • (?:text)防止反向引用,请删除?:如果需要)
  • 根据您的使用方式,您可能必须转义/ -> \\/

三个不同的字段只是拆分的问题, /是分隔符。

  • 天(01至31)

     0[1-9]|[12][0-9]|3[01] 
  • 月(01至12)

     0[1-9]|1[0-2] 
  • 年(1900-2099)

     (?:19|20)[0-9]{2} 

您最好对/进行拆分,然后测试所有单个部分。 但是,如果您真的想使用正则表达式,可以尝试以下一种:

#^(?:(?:(?:(?:0?[13578])|(1[02]))/31/(19|20)?\d\d)|(?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)|(?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))|(?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d))$#

说明:

^            # start of line
 (?:         # group without capture
             # that match 31st of month 1,3,5,7,8,10,12
   (?:       # group without capture
     (?:     # group without capture
       (?:   # group without capture
         0?  # number 0 optionnal
         [13578] # one digit either 1,3,5,7 or 8
       )     # end group
       |     # alternative
       (1[02]) # 1 followed by 0,1 or 2
     )       # end group
     /       # dash
     31      # number 31
     /       # dash
     (19|20)? #numbers 19 or 20 optionnal
     \d\d    # 2 digits from 00 to 99 
   )         # end group
|
   (?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)
|
   (?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))
|
   (?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d)
 )
$

我已经解释了第一部分,其余部分留作练习。

此匹配一个无效日期:02/29/1900,但对于01/01/1900到12/31/2099之间的任何其他日期都是正确的

您想要的日期格式的正则表达式应该是这样的

[0-9]{2}/[0-9]{2}/[0-9]{4}

这应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM