JS数组去重不依赖正则,但含干扰字符的文本数组需先用正则清洗(如去空格、剔标点、转小写)再Set去重,否则“abc ”与“abc”被视为不同项。

JS 数组去重本身不直接依赖正则表达式,但当你面对的是「含干扰字符的文本数组」(比如带空格、标点、HTML标签、多余换行等的字符串),就需要先用正则清洗,再统一去重——这是实际开发中非常典型的组合场景。
先用正则清理再统一去重
核心逻辑是:对每个字符串元素做标准化预处理(如去除首尾空格、合并连续空白、剔除特定符号),再执行去重。否则 "abc " 和 "abc" 会被视为两个不同项。
- 常见清洗正则示例:
-
str.trim()→ 去首尾空格(最基础) -
str.replace(/\s+/g, ' ').trim()→ 合并中间多个空白为单个空格 -
str.replace(/[^\w\u4e00-\u9fa5\s]/g, '')→ 只保留字母、汉字、数字、空格(剔除标点/emoji/HTML符号等) -
str.replace(/]*>/g, '').replace(/\s+/g, ' ').trim()→ 清除 HTML 标签 + 规范空白
结合 Set 实现清洗后去重(推荐)
这是最简洁、高效、可读性强的做法,适合绝大多数文本数组场景:
const raw = [' hello ', 'hello', 'HELLO', 'hello!', ' world ', 'world'];
const cleanedUnique = [...new Set(
raw.map(str =>
str
.replace(/[^\w\u4e00-\u9fa5]/g, ' ') // 替换非文字字符为空格
.replace(/\s+/g, ' ') // 多空格→单空格
.trim() // 去首尾空格
.toLowerCase() // 统一大小写(按需)
)].filter(Boolean); // 过滤掉清洗后为空字符串的项
console.log(cleanedUnique); // ['hello', 'world']
按业务规则定制清洗逻辑
比如处理用户输入的邮箱列表,需忽略大小写和前后空格,但保留 @ 和 .:
- 正则清洗:
email.trim().toLowerCase()就足够,无需复杂正则 - 若含乱码或分隔符(如
"user@example.com;admin@test.org"),先用正则切分再清洗: text.split(/[,;,;\s]+/).map(s => s.trim()).filter(Boolean)
注意正则清洗的边界情况
避免过度清洗导致语义丢失。例如:
- 清洗手机号时不能删掉
-或+(国际号) - 清洗代码片段时不能删掉
{}、[]等语法符号 - 中文标点(,。!?)和英文(, . ! ?)应区分处理,必要时用 Unicode 范围匹配











