本文摘要
这篇 JavaScript 工具函数通过类型编号映射表,把数字、字母、汉字、特殊符号和空格五类字符统一成检测与过滤两套正则,一次调用即可返回是否命中目标类型以及剔除这些字符后的字符串。文章给出使用示例、参数对照表和空数组等边界情况说明,并展示了清理输入、提取纯文本、密码强度校验等场景,适合需要在表单校验或数据清洗中复用字符过滤逻辑的前端开发者参考。
/**
* 校验字符串并返回结果及过滤后的字符串
* @param {string} str - 待处理的字符串
* @param {number[]} types - 需要检查/过滤的类型数组 (1-5)
* @returns {object} 包含校验结果和过滤后的字符串
*/
function checkAndFilter(str, types) {
// 校验规则映射表
const checkRules = {
1: { pattern: "\\d", regex: /\d/ }, // 数字
2: { pattern: "[a-zA-Z]", regex: /[a-zA-Z]/ }, // 字母
3: { pattern: "\\u4e00-\\u9fa5", regex: /[\u4e00-\u9fa5]/ }, // 汉字
4: { pattern: "[^\\w\\u4e00-\\u9fa5]", regex: /[^\w\u4e00-\u9fa5]/ }, // 特殊符号
5: { pattern: "\\s", regex: /\s/ } // 空格
};
const patterns = types
.filter(t => checkRules[t])
.map(t => `(${checkRules[t].pattern})`)
.join("|");
const filterRegex = patterns ? new RegExp(patterns, "g") : null;
const filteredStr = filterRegex ? str.replace(filterRegex, "") : str;
const result = types.some(t =>
checkRules[t] ? checkRules[t].regex.test(str) : false
);
return {
result,
filteredStr
};
}

使用示例

const str = "Hello123 你好_world!";
// 示例1:过滤数字(1)和空格(5)
const result1 = checkAndFilter(str, [1, 5]);
console.log(result1);
// 输出: { result: true, filteredStr: "Hello你好_world!" }
// 示例2:仅过滤汉字(3)
const result2 = checkAndFilter(str, [3]);
console.log(result2);
// 输出: { result: true, filteredStr: "Hello123 _world!" }
// 示例3:过滤不存在的类型(6)
const result3 = checkAndFilter("test", [6]);
console.log(result3);
// 输出: { result: false, filteredStr: "test" }

主要改进说明

  1. 双模式处理:

    • regex 字段用于快速检测字符存在性(.test())
    • pattern 字段用于构建过滤正则表达式(.replace())
  2. 智能过滤逻辑:

    // 组合多个类型的正则表达式
    // 例如 [1,5] 会生成 /(\d)|(\s)/g
    const patterns = types.map(t => `(${checkRules[t].pattern})`).join("|");
  3. 空类型处理:

    // 当传入空数组或无效类型时,返回原字符串
    checkAndFilter("abc", []) // => { result: false, filteredStr: "abc" }
  4. 全局过滤:

    // 使用 g 标志替换所有匹配项
    str.replace(filterRegex, "")

参数对应关系

类型说明正则表达式示例过滤效果
1数字\d”a1b” → “ab”
2字母[a-zA-Z]”中a文1” → “中1”
3汉字[\u4e00-\u9fa5]”hello你好” → “hello”
4特殊符号[^\w\u4e00-\u9fa5]”a!b#c” → “abc”
5空格(含换行制表符)\s”a b\tc” → “abc”

该函数可以灵活处理各种字符过滤需求,例如:

  • 清理输入内容:checkAndFilter(input, [4,5]) 移除所有特殊符号和空格
  • 提取纯文本:checkAndFilter(text, [1,4,5]).filteredStr 保留汉字和字母
  • 密码强度校验:结合多个类型检测结果判断复杂度