You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:02:00