我在 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; 更正后的版本如下所示:
如果其他人遇到此问题,请务必检查产品模式正则表达式(通过 console.log() 或其他方式)以确保它与您的原始正则表达式匹配。