角反应形式模式验证器在正则表达式中添加$并破坏验证

时间:2018-08-08 08:06:01

标签: regex angular angular-reactive-forms

我正在尝试使用以下正则表达式验证密码:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.{8,})
请注意,没有终结符$,因为这将阻止接受有效的密码。 (我不确定为什么输入字段不会终止字符串)。
但是,Angular的Validators.pattern添加了字符串char的末尾。因此,我的有效密码失败。
如何防止模式验证器添加$
我想我可以使用自己的密码验证器,但是肯定有更好的解决方案...?

编辑: 密码应该成功:

  • Test1234
  • tEst1234
  • tesT1234
  • 1234Test
  • 1234tesT
  • t#St1234

应该失败的密码:

  • TEST1234
  • test1234
  • tEst123
  • Test123
  • testtest
  • 12345678

验证者声明:

this.password = new FormControl('', [Validators.required, Validators.pattern('^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.{8,})')]);
this.userForm.addControl('Password', this.password);

1 个答案:

答案 0 :(得分:8)

您可以在末尾添加.*,甚至可以稍微修改一下模式,以将一个先行模式转换为使用模式:

Validators.pattern('(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}')

或者,更好的是,使用正则表达式进行密码验证时,请遵循principle of contrast

Validators.pattern('(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]).{8,}')

Angular将在正则表达式模式的两端添加^$,因此该模式看起来像

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]).{8,}$

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?=[^A-Z]*[A-Z])-至少1个大写ASCII字母
  • (?=[^a-z]*[a-z])-至少1个小写ASCII字母
  • (?=[^0-9]*[0-9])-至少1个ASCII数字
  • .{8,}-任意8个或更多字符(换行符除外)
  • $-字符串的结尾。