RegEx 在生产版本中未正确验证,不接受 0、2、7、a、c、u、x,有时还接受 z

问题描述 投票:0回答:1

我在 4.9.5 中使用 Angular 15.2.10 和 Typescript。 我的一个库中提供了以下正则表达式,并通过服务公开:

  private readonly _DISALLOWED_CHARS_REGEX_GENERAL = new RegExp(/^[^\\/\?\!\&\:\*\<\>\|\~\%\§\@\{\}\[\]\(\)\=\$\€\"]+$/);
  /**
  * Generally Forbidden chars: '\' '/' '?' '!' '&' ':' '*' '<' '>' '|' '~' '%' '§' '@' '{' '}' '[' ']' '(' ')' '=' '$' '€' and '"'
  */
  public get DISALLOWED_CHARACTER_REGEX_GENERAL(): RegExp {
    return this._DISALLOWED_CHARS_REGEX_GENERAL;
  }

当前在我的代码中的两个不同位置访问它 首先以表格形式:

this.form = this.formBuilder.group({
      formElement1: ['', {
        validators: [Validators.maxLength(32), Validators.pattern(this.regexService.DISALLOWED_CHARACTER_REGEX_GENERAL)],
      }],
      formElement2: ['', {
        validators: [Validators.maxLength(32), Validators.pattern(this.regexService.DISALLOWED_CHARACTER_REGEX_GENERAL)],
      }]
    });

其次,它只是在另一个组件中用作正则表达式:

  public isGroupNameValidCheck(): void {
    if (this.groupName && this.groupName !== '') {
      const regEx = this.regexService.DISALLOWED_CHARACTER_REGEX_GENERAL;
      this.isGroupNameValid = regEx.test(this.groupName);
     }
  }

现在,在开发版本上评估此正则表达式时,正则表达式会正确拒绝所有指定的特殊字符,而允许其他所有字符作为输入。 但是,如果我在构建生产后使用该项目,正则表达式会错误地标记 0, 2, 7, a, c, u, x,有时还会标记 z注意:作为大写字母,所有字母都被接受。

RegEx 在 regexr 和 regex101 上正常工作。我的同行已经对其进行了审查,没有人能够发现它的问题。 到目前为止,我在 Angulars GitHub 上的研究导致了“类似的问题”和“可能的原因”。但在我将 RegEx 中的字符一一替换为各自的 ASCII 值之前,我想先在这里问一下。 我强烈怀疑我的正则表达式在缩小过程中发生了一些事情,但到目前为止我无法验证这一点。 没有编译器问题,没有console.logs,没有任何暗示我这边可能出现错误的信息。 更新: 我将变量声明更改为不使用 RegEx 构造函数,而是按照 Wiktor Stribiżew 的建议使用 RegEx Literal,但这并没有解决问题。 在使用 --source-map=true 构建生产版本后,我发现 RegEx 没有被 Angular 正确转换,它变成了

/^[^\\/\?\!\&\:\*\<\>\|\~\%\\xa7\@\{\}\[\]\(\)\=\$\\u20ac\"]+$/

因此我在 
Angulars Github
开了一张票。毕竟这可能是我之前在帖子中提到的 ASCII 问题。

用 Unicode 表示替换有问题的特殊字符后,正则表达式会被正确评估,在产品模式构建中也是如此。就我而言,它是“§”字符,未正确转换。此外,“€”的转换没有删除前导转义符号,因此它变成了 \u20ac 而不是 \u20ac; 更正后的版本如下所示:

angular regex typescript angular-forms
1个回答
0
投票

如果其他人遇到此问题,请务必检查产品模式正则表达式(通过 console.log() 或其他方式)以确保它与您的原始正则表达式匹配。

© www.soinside.com 2019 - 2024. All rights reserved.