日期验证模式不适用于Angular 2验证模式

时间:2017-09-21 19:17:43

标签: regex angular validation angular-material

我在这里问,因为我怀疑Angular 2验证模式可能与其他语言中的验证模式不同。

我有一个日期模式,我用于我的asp.net验证得到mm / dd / yyyy,考虑到闰年等,也接受m / d / yyyy。它的用法如下。

dateSubmitted: [null, [Validators.required, Validators.pattern('((^(10|12|0?[13578])([/])(3[01]|[12][0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(11|0?[469])([/])(30|[12][0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(0?2)([/])(2[0-8]|1[0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(0?2)([/])(29)([/])([2468][048]00)$)|(^(0?2)([/])(29)([/])([3579][26]00)$)|(^(0?2)([/])(29)([/])([1][89][0][48])$)|(^(0?2)([/])(29)([/])([2-9][0-9][0][48])$)|(^(0?2)([/])(29)([/])([1][89][2468][048])$)|(^(0?2)([/])(29)([/])([2-9][0-9][2468][048])$)|(^(0?2)([/])(29)([/])([1][89][13579][26])$)|(^(0?2)([/])(29)([/])([2-9][0-9][13579][26])$))')]],

这种模式在我的asp.net应用程序中运行得很好,但它不在Angular2中,无论我是否尝试在输入框中键入正确的日期格式或使用材料日期选择器输入它,它都会失败。我无法找到任何有关此事的内容。我已成功应用Angular2中的其他模式,如电子邮件。

如果需要此信息,我的package.json中的角度版本如下:

"@angular/animations": "^4.3.6",
    "@angular/cdk": "^2.0.0-beta.10",
    "@angular/common": "^4.1.0",
    "@angular/compiler": "^4.1.0",
    "@angular/core": "^4.1.0",
    "@angular/forms": "^4.1.0",
    "@angular/http": "^4.1.0",
    "@angular/material": "^2.0.0-beta.10",
    "@angular/platform-browser": "^4.1.0",
    "@angular/platform-browser-dynamic": "^4.1.0",
    "@angular/router": "^4.1.0",
    "@ngrx/core": "^1.2.0",

修改:添加了plunker:https://plnkr.co/edit/qHPZceVTpS4x1AEqZfjA

1 个答案:

答案 0 :(得分:1)

由于\d被视为字符串转义序列而不是正则表达式转义序列,因此您使用的模式未正确编译。要实现这一点,您需要加倍反斜杠。

此外,您的替代方案都附有^$个锚点。虽然它是正确的,但它看起来效率不高:将一个^放在开头,一个$放在模式的末尾是有意义的,同时将备选方案包含在非捕获中基。

此外,您可以将所有捕获组转换为非捕获组(即(...)(?:...))以获得更多性能,并将[/]替换为仅仅{{1}因为/符号不需要在/构造函数内转义。

所以,你可以使用

RegExp

请参阅updated Plunkr