【问题标题】:JavaScript regular expression to match mm/dd/yyyy format - restrict to numeric input only匹配 mm/dd/yyyy 格式的 JavaScript 正则表达式 - 仅限数字输入
【发布时间】:2011-01-26 18:09:42
【问题描述】:

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

01 / 16 / 1985

对于 1985 年 1 月 16 日的日期。

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

下面是我正在使用的代码以及我的 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?
);

【问题讨论】:

    标签: javascript regex date


    【解决方案1】:
    (?: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}
      

    【讨论】:

    • 没有 /,有 3 个单独的文本字段,用 / / /
    【解决方案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 之间的任何其他日期都是正确的

    【讨论】:

      【解决方案3】:

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

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

      这应该可以。

      【讨论】:

      • 这样,我不能输入 99/99/9999 的日期吗?我正在寻找有效日期的条目。查看我为每个文本字段注释掉的伪正则表达式。
      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2020-04-09
      • 2023-04-07
      • 2022-01-04
      相关资源
      最近更新 更多