使用正则表达式将md-datepicker日期格式验证为MM / DD / YYYY

时间:2017-09-12 16:14:56

标签: angularjs regex datepicker angular-material2

我只是尝试使用正则表达式将md-datepicker日期格式验证为 MM / DD / YYYY ,并按以下方式验证md-error

这是Regular Expression接受 MM / DD / YYYY 格式

const DOB_REGEX = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;

这是 input-errors-example.ts 文件

import {Component} from '@angular/core';
import {FormControl, Validators} from '@angular/forms';

const DOB_REGEX = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;

@Component({
  selector: 'input-errors-example',
  templateUrl: 'input-errors-example.html',
  styleUrls: ['input-errors-example.css'],
})
export class InputErrorsExample {


    dobFormControl = new FormControl(null, [
        Validators.required,
        Validators.pattern(DOB_REGEX)
    ]);

}

这是上面

的html代码段
<form class="example-form">

  <md-form-field class="example-full-width">
    <input mdInput [mdDatepicker]="picker" placeholder="Choose a date" [formControl]="dobFormControl" onkeypress='return (event.charCode >= 48 && event.charCode <= 57) || event.charCode == 47' maxlength="10">
    <md-datepicker-toggle mdSuffix [for]="picker"></md-datepicker-toggle>
    <md-datepicker #picker></md-datepicker>
    <md-error *ngIf="dobFormControl.hasError('required') || dobFormControl.hasError('pattern')">
      Please enter a valid Date
    </md-error>
  </md-form-field>

</form>

this is the Plunker与此问题有关。

这是正常运行,但对于有效日期输入,这一次显示错误消息。

除了我尝试使用不同的正则表达式,但同样的事情发生了,我的方法有什么问题或如何克服这个问题

2 个答案:

答案 0 :(得分:1)

那个正则表达式看起来很混乱。我认为这可以做你想做的事情:

/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$/

给你一个机会,你应该好好去。我觉得这很干净。它几乎是2个数字的硬编码范围,分隔符(可以更改),2个硬编码数字,分隔符和4个数字(1900-2999)。这可以调整,因为你可能不想要1900例如。

- 更新,对评论的回应: 如何设置javascript一定有些奇怪。这是一个有效的python示例:

import re

def main():
    theregex = re.compile("^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$")
    if re.search(theregex, "04/26/2017"):
        print ("match")

main()

答案 1 :(得分:0)

你可以试试的东西。
经过测试并与Leap Years合作。

实际上可以减少更多..哦,好吧

MMDDYYYY年份1900 - 2999

^(?:(?:(?:0?[13578]|1[02])([/.-])(?:0?[1-9]|[12]\d|3[01])\1|0?2([/.-])(?:0?[1-9]|1\d|2[0-8])\2|(?:0?[469]|11)([/.-])(?:0?[1-9]|[12]\d|30)\3|(?:0?[1-9]|[1-2]\d|3[0-1])([/.-])(?:0?[13578]|1[02])\4|(?:0?[1-9]|1\d|2[0-8])([/.-])0?2\5|(?:0?[1-9]|[12]\d|30)([/.-])(?:0?[469]|11)\6)(?:(?:19)?\d{2}|2\d{3})|(?:0?2([/.-])29\7|29([/.-])0?2\8)(?:19(?:0[48]|1[26]|2[048]|3[26]|4[048]|5[26]|6[048]|7[26]|8[048]|9[26])|2(?:[048](?:0[048]|1[26]|2[048]|3[26]|4[048]|5[26]|6[048]|7[26]|8[048]|9[26])|[1235679](?:0[48]|1[26]|2[048]|3[26]|4[048]|5[26]|6[048]|7[26]|8[048]|9[26]))))$

Regexr演示http://regexr.com/3go0m

 ^     
 (?:
      # Non-Leap Years
      (?:
           # Month Day 

           (?: 0? [13578] | 1 [02] )
           ( [/.-] )                     # (1)
           (?: 0? [1-9] | [12] \d | 3 [01] )
           \1 
        |  
           0?2
           ( [/.-] )                     # (2)
           (?: 0? [1-9] | 1 \d | 2 [0-8] )
           \2 
        |  
           (?: 0? [469] | 11 )
           ( [/.-] )                     # (3)
           (?: 0? [1-9] | [12] \d | 30 )
           \3              

        |                              # or
           # Day Month   

           (?: 0? [1-9] | [1-2] \d | 3 [0-1] )
           ( [/.-] )                     # (4)
           (?: 0? [13578] | 1 [02] )
           \4 
        |  
           (?: 0? [1-9] | 1 \d | 2 [0-8] )
           ( [/.-] )                     # (5)
           0?2
           \5 

        |  
           (?: 0? [1-9] | [12] \d | 30 )
           ( [/.-] )                     # (6)
           (?: 0? [469] | 11 )
           \6              

      )
      (?:                           # Year  1900 - 2999
           (?: 19 )?                     # 2 digits defaults to current century
           \d{2} 
        |  
           2 \d{3} 
      )
   |  
      # Leap Years
      (?:
           # Month Day 
           0?2
           ( [/.-] )                     # (7)
           29
           \7 
        |                              # or,

           # Day Month   
           29
           ( [/.-] )                     # (8)
           0?2
           \8 
      )

      # Leap Years  1900 - 2999
      (?:
           19
           (?:
                0 [48] 
             |  1 [26] 
             |  2 [048] 
             |  3 [26] 
             |  4 [048] 
             |  5 [26] 
             |  6 [048] 
             |  7 [26] 
             |  8 [048] 
             |  9 [26] 
           )
        |  2
           (?:
                [048] 
                (?:
                     0 [048] 
                  |  1 [26] 
                  |  2 [048] 
                  |  3 [26] 
                  |  4 [048] 
                  |  5 [26] 
                  |  6 [048] 
                  |  7 [26] 
                  |  8 [048] 
                  |  9 [26] 
                )
             |  [1235679] 
                (?:
                     0 [48] 
                  |  1 [26] 
                  |  2 [048] 
                  |  3 [26] 
                  |  4 [048] 
                  |  5 [26] 
                  |  6 [048] 
                  |  7 [26] 
                  |  8 [048] 
                  |  9 [26] 
                )
           )
      )
 )
 $