Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 模式(RegEx)没有像我认为的那样工作_Angular - Fatal编程技术网

Angular 模式(RegEx)没有像我认为的那样工作

Angular 模式(RegEx)没有像我认为的那样工作,angular,Angular,这是一个奇怪的问题,我似乎在任何地方都找不到它。我在各地找到的所有正则表达式都是这样的: (?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,}) 'password': new FormControl( this.register.password, [ Validator.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,}

这是一个奇怪的问题,我似乎在任何地方都找不到它。我在各地找到的所有正则表达式都是这样的:

(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})
'password': new FormControl( this.register.password, [ Validator.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})') ]
Bue当我将其传递到formControl时,如下所示:

(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})
'password': new FormControl( this.register.password, [ Validator.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})') ]

当我满足密码的所有要求时,它不会生效。有人能帮我吗?我不熟悉正则表达式。

由于patternstring的实现方式,您的验证器无法工作

是验证程序的源代码,也是其内部的源代码。对于您来说,最有趣的部分是当您传递字符串时代码所经过的行if typeof pattern==='string',而不是RegExp

老实说,我为你创造了一个世界,你应该创造它

注意第一个示例中正则表达式的外观

现在,正如您所看到的不同,它最终解释了您输入的RegExp实际上在做什么,以及为什么它永远不会发生

整个regexp是一个巨人,从根本上说,这意味着它不会遍历整个输入字符串,因此它永远不会到达$符号,因为在匹配后,它将忘记这个先行字符,并返回到第一个非先行字符,这是字符串的开始,这意味着^?=.[a-z]?=.[a-z]?=.[0-9]?=.[!@$%^&*]?=。{8,}$永远不会匹配

^?=.[a-z]?=.[a-z]?=.[0-9]?=.[!@$%^&*]?=.{8,}$-永远不会匹配,因为它只是从字符串的开头向前看,永远不会满足$, ^?=.[a-z]?=.[a-z]?=.[0-9]?=.[!@$%^&*]?=.{8,}-将匹配,因为我们自然地从字符串的开头开始。 ?=.[a-z]?=.[a-z]?=.[0-9]?=.[!@$%^&*]?=.{8,}-将匹配至少包含1个小写字母、大写字母、数字和特殊字符的任何字符串,且其长度必须大于7。 例如:

因此,总结一下:

不要抄袭你不懂的东西,并期望它能起作用, Validators.patternstring将在字符串的开头和结尾添加^和$符号,然后再将其转换为RegExp 要不允许这样做,只需使用Validators.patternRegExp …或者只是不使用RegExp惰性地进行验证,对于一个基本的8个字符长的字符串,它将执行130多个步骤来验证它。
谢谢Eatos,你是对的,我应该做一个StackBlitz让你们更好地理解我。谢谢你在回答中花时间,我现在明白了,我应该在实现它之前花时间更好地理解它。老实说,我建议你创建自己的验证器,或者在npm中寻找一些。模式验证器w我不会告诉用户为什么他输入的密码不正确。而且有几个密码很容易写。无论如何,我会删除我的否决票。你必须以任何方式编辑该问题,以使我能够对其进行否决