我有一个用于验证密码的正则表达式,该密码必须至少为8个字符,并且必须包含字母(大写和小写)数字以及来自^ $ *的特殊字符。 [] {}()? -“!@#%&/ \,> <':; | _〜`。
我遇到2个问题,在将/添加到reg exp后无法识别(其他字符仍然可以正常工作。如果我也添加/],该表达式也将不再起作用(尽管模式似乎是正确的,但所有内容都无效)在浏览器调试模式下可以)。
正则表达式字符串
static get PASSWORD_VALIDATION_REGEX(): string {
return '(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z])' + // contains lowercase number uppercase
'(?=.*[\-~\$@!%#<>\|\`\\\/\[;:=\+\{\}\.\(\)*^\?&\"\,\'])' + // special
'.{8,}'; // more than allowed char
}
我将正则表达式用作形式验证器和功能匹配项
password: ['', {validators: [Validators.required,
Validators.pattern(StringUtils.PASSWORD_VALIDATION_REGEX)
],
updateOn: 'change'
}
]
//....
value.match(StringUtils.PASSWORD_VALIDATION_REGEX)
试图仅将(?=.*[\\])
用于特殊字符列表,在这种情况下,我收到了控制台错误
Invalid regular expression: /^(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[\]).{8,}$/: Unterminated character class
对于'(?=.*[\]])'
,没有控制台错误,但表单验证“模式”中存在以下错误
actualValue: "AsasassasaX000[[][]"
requiredPattern: "^(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[]]).{8,}$"
相同的值和模式在https://regex101.com/上失败
感谢您的帮助/建议!
答案 0 :(得分:1)
您已转义了模式,但未能正确转义]
字符。在JavaScript正则表达式中,必须对字符类内的]
进行转义。
如果您对如何在字符串文字中定义转义感到困惑(这确实相当令人困惑),则应使用正则表达式文字。关于Validators.pattern
使用正则表达式要记住的一件事是,字符串模式由Angular框架锚定,方法是将整个模式用^
和$
括起来,因此,当您将模式定义为正则表达式文字。
使用
static get PASSWORD_VALIDATION_REGEX(): string {
return /^(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[-~$@!%#<>|`\\\/[\];:=+{}.()*^?&",']).{8,}$/;
}
请注意,与\]
字符和]
匹配的\\
与\
内部的[...]
匹配。