【问题标题】:Regex issue in Angular with password patternAngular中带有密码模式的正则表达式问题
【发布时间】:2019-12-14 21:19:30
【问题描述】:

FormControl() Validators.pattern() 使用此正则表达式验证密码时遇到问题,该密码包含 1 个字符、1 个数字、最少 8 个字符、最多 16 个字符.


通过验证器的测试密码:

asdfqwer //不应该通过验证器

zxcvasdf //不应该通过验证器

asdfqwer2 //没错


未通过验证器的测试密码:

程序 //没错


在服务器端尝试这种模式或使用在线正则表达式测试平台没有问题

// some code
password: new FormControl('',
    [
      Validators.minLength(8),
      Validators.maxLength(16),
      Validators.pattern('^$|^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$')
    ]),
// some code

【问题讨论】:

  • 为什么一开始就有^$^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$这就够了,你也不需要检查长度

标签: javascript regex angular validation


【解决方案1】:

你可以使用

Validators.pattern('(?:(?=[^A-Za-z]*[A-Za-z])(?=\\D*\\d)[A-Za-z\\d]{8,16})?')

Angular 会自动将字符串模式用^$ 括起来,使其成为'^(?:(?=[^A-Za-z]*[A-Za-z])(?=\\D*\\d)[A-Za-z\\d]{8,16})?$'

注意双反斜杠:在字符串文字中,您必须用另一个反斜杠转义反斜杠来定义文字反斜杠,这是一个正则表达式转义字符。

由于整个模式被一个可选的非捕获组包围,一个空字符串也将与模式匹配。

(?=[^A-Za-z]*[A-Za-z])(?=\\D*\\d) 现在没有 .*,这与 principle of contrast 一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多