无效的正则表达式 - 字符 class 中的无效 属性 名称

Invalid regular expression - Invalid property name in character class

我正在使用一个 fastify 服务器,其中包含一个调用函数的打字稿文件,以确保人们不会发送不需要的字符。这是函数:

const SAFE_STRING_REPLACE_REGEXP = /[^\p{Latin}\p{Zs}\p{M}\p{Nd}\-\'\s]/gu;
function secure(text:string) {
  return text.replace(SAFE_STRING_REPLACE_REGEXP, "").trim();
}

但是当我尝试启动我的服务器时,我收到一条错误消息: “无效的正则表达式 - 字符 class 中的无效 属性 名称”。

它曾经与我以前的正则表达式一起工作得很好:

const SAFE_STRING_REPLACE_REGEXP = /[^0-9a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð\-\s\']/g;
function secure(text:string) {
  return text.replace(SAFE_STRING_REPLACE_REGEXP, "").trim();
}

但有人告诉我它优化不够。我也被告知在性能方面使用 split/join 比 regex/replace 更好,但我不知道我是否可以使用它。

你需要使用

const SAFE_STRING_REPLACE_REGEXP = /[^\p{Script=Latin}\p{Zs}\p{M}\p{Nd}'\s-]/gu;
// or
const SAFE_STRING_REPLACE_REGEXP = /[^\p{sc=Latin}\p{Zs}\p{M}\p{Nd}'\s-]/gu;

您需要在 Unicode 类别 classes 中为脚本添加 sc=Script= 前缀,因此 \p{Latin} 应指定为 \p{Script=Latin}。参见 ECMAScript reference.

此外,当您使用 u 标志时,您无法转义 non-special 字符,所以不要转义 ' 并且最好将 - 字符移到末尾字符 class.

你也可以使用 split&join:

const SAFE_STRING_REPLACE_REGEXP = /[^\p{Script=Latin}\p{Zs}\p{M}\p{Nd}'\s-]/u;
console.log("Ącki-Łał русский!!!中国".split(SAFE_STRING_REPLACE_REGEXP).join(""))

请注意,split 不需要 g 修饰符,这是默认行为。