我只是尝试使用正则表达式将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与此问题有关。
这是正常运行,但对于有效日期输入,这一次显示错误消息。
除了我尝试使用不同的正则表达式,但同样的事情发生了,我的方法有什么问题或如何克服这个问题
答案 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]
)
)
)
)
$