Angularjs MMMM dd,yyyy ng-pattern返回错误

问题描述:

我有一个设置为日期的字段作为值输入,但每当输入日期时,AngularJs都会在字段上返回错误。Angularjs MMMM dd,yyyy ng-pattern返回错误

这是模式的外观

ng-pattern='/^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2}))/' 

我测试过的图案上regexr,它的工作。我正在测试的日期是2016年6月30日

+0

尽管编译良好,但你的regex看起来很糟糕,你可以看看[Debuggex Demo](https://www.debuggex.com/r/zXqxzmY0J6ClQoaP)。我会用一种不同的方式来测试它,你可以使用一种方法来验证日期并将它传递给ng-pattern,如'ng-pattern ='myValidation()'' –

+2

为什么你允许匹配“Mary”马(R(CH)|?Y)')? –

我检查了您的正则表达式(它非常深思熟虑),最后根据您的概念重新编写了它。

这里是我结束了:

((Jan(uary)?|Mar(ch)?|July?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31|(Jan(uary)?|Mar(ch)?|Apr(il)?|July?|June?|Aug(ust)?|Oct(ober)?|Sep|(Sept|Nov|Dec)(ember)?) (0?[1-9]|([12]\d)|30)|Feb(ruary)? (0?[1-9]|1\d|2[0-8]|29(?=, ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00)))), (1[6-9]|[2-9]\d)\d{2} 

下面是一个例子:https://regex101.com/r/gS0xB4/1

这里,它是打破了一点:

(// Begin get month and a day 
    (Jan(uary)?|Mar(ch)?|July?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31 // Months with 31 days, and a 31 
    | // OR 
    (Jan(uary)?|Mar(ch)?|Apr(il)?|July?|June?|Aug(ust)?|Oct(ober)?|Sep|(Sept|Nov|Dec)(ember)?) // Every month but Feb, and... 
    (0?[1-9]|([12]\d)|30) // A number from 1-30, optionally padded to 2 digits 
    | // OR 
    Feb(ruary)? // Feburary, and... 
     (0?[1-9]|1\d|2[0-8] // A number from 1-28, optionally padded to 2 digits 
     | // OR 
     29(?=, (// A 29, IF it is followed by a comma and... 
      (1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26]) // A year which is a multiple of 4, but not a multiple of 100 
      | // OR 
      (16|[2468][048]|[3579][26])00) // A year which is a multiple of 400 
     ) // End 29 conditional 
    ) // End Feb 
) // End month and day 
, (1[6-9]|[2-9]\d)\d{2} // A comma, and a year between 1600 and 9999 

我没有任何捕获因为我只是试图让它匹配 - 但它们应该很容易添加。我也删除了所有的转义,所以你可能不得不将它们添加回去如果引擎要求他们。