无效的正则表达式 - 字符 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
修饰符,这是默认行为。
我正在使用一个 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
修饰符,这是默认行为。