TypeScript正则转义无效问题:特殊字符允许选项报错修正
解决TypeScript字符串验证函数的正则无效转义错误
我在TypeScript项目中实现了一个字符串验证函数,用于校验字符串是否仅包含允许的字符,函数接收字符串与配置项参数。但启用allowSpecialCharacters选项时,执行Jest测试会出现“Invalid escape”正则表达式语法错误,即便对特殊字符做了转义也无法解决。
问题原因分析
- 过度转义:在正则字符集
[]内,多数特殊字符(如!@#$%^&*()_=+{}|;:'",./<>?)无需转义,过度转义会生成无效转义序列; - 转义错误:部分字符的转义处理不符合规则,例如
&无需转义,转义后会触发无效转义错误。
修正后的代码
/** * 验证字符串是否仅包含允许的字符 * @param {string} name - 待验证的字符串 * @param {Object} [options] - 验证配置项 * @param {boolean} [options.allowNumbers=false] - 是否允许数字 * @param {boolean} [options.allowSpecialCharacters=false] - 是否允许特殊字符 * @param {boolean} [options.allowSpaces=false] - 是否允许空格 * @param {boolean} [options.allowUnderscores=false] - 是否允许下划线 * @param {boolean} [options.allowDashes=false] - 是否允许连字符 * @param {boolean} [options.allowPunctuation=false] - 是否允许标点符号 * @param {boolean} [options.allowCyrillic=false] - 是否允许西里尔字母 * @param {boolean} [options.allowNonLatin=false] - 是否允许非拉丁字符 * @returns {boolean} 字符串是否验证通过 */ interface IValidateNameOptions { allowNumbers?: boolean; allowSpecialCharacters?: boolean; allowSpaces?: boolean; allowUnderscores?: boolean; allowDashes?: boolean; allowPunctuation?: boolean; allowCyrillic?: boolean; allowNonLatin?: boolean; } interface IValidateName { (name: string, options?: IValidateNameOptions): boolean; } export const validateName: IValidateName = ( name, options = { allowNumbers: false, allowSpecialCharacters: false, allowSpaces: false, allowUnderscores: false, allowDashes: false, allowPunctuation: false, allowCyrillic: false, allowNonLatin: false, }, ) => { let regexStr = `^[a-zA-Z`; if (options.allowNonLatin) { regexStr += `\\p{L}`; } if (options.allowNumbers) { regexStr += `0-9`; } if (options.allowSpecialCharacters) { // 仅转义字符集中有特殊意义的字符:]、\、-(放在中间时) regexStr += `!@#$%^&*()_=+\\[\\]{}|;:'\",./<>?\\-`; } if (options.allowSpaces) { regexStr += `\\s`; } if (options.allowUnderscores) { regexStr += `_`; } if (options.allowDashes) { regexStr += `-`; } if (options.allowPunctuation) { regexStr += `\\p{P}`; } if (options.allowCyrillic) { regexStr += `\\p{Cyrillic}`; } regexStr += `]+$`; const regex = new RegExp(regexStr, 'u'); return regex.test(name); };
内容的提问来源于stack exchange,提问作者Deri Kurniawan
相关产品推荐
相关产品推荐

