正则表达式不适用于\和]

时间:2019-04-04 11:59:38

标签: regex angular validation passwords angular7

我有一个用于验证密码的正则表达式,该密码必须至少为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/上失败

感谢您的帮助/建议!

1 个答案:

答案 0 :(得分:1)

您已转义了模式,但未能正确转义]字符。在JavaScript正则表达式中,必须对字符类内的]进行转义。

如果您对如何在字符串文字中定义转义感到困惑(这确实相当令人困惑),则应使用正则表达式文字。关于Validators.pattern使用正则表达式要记住的一件事是,字符串模式由Angular框架锚定,方法是将整个模式用^$括起来,因此,当您将模式定义为正则表达式文字。

使用

static get PASSWORD_VALIDATION_REGEX(): string {
    return /^(?=.*[a-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[-~$@!%#<>|`\\\/[\];:=+{}.()*^?&",']).{8,}$/;
}

请注意,与\]字符和]匹配的\\\内部的[...]匹配。