需求:编写正则表达式去重、删数字括号并指定保留字符
解决方案:动态指定保留字符并完成去重与无关字符清理
核心思路
先过滤掉所有不属于指定保留集合的字符(包含数字、括号等),再对保留的字符去重,仅保留每个字符的首次出现。
分步实现
过滤非保留字符
使用反向字符集正则匹配所有不在保留列表中的字符,全局替换为空。如果保留字符包含正则特殊字符(如^、-、]),需要先转义避免正则语法错误。const input = "{1}{G}{G}{U}{U}{W}"; const keepChars = "GUW"; // 正则特殊字符转义函数 const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const safeKeepChars = escapeRegExp(keepChars); // 过滤后得到仅含保留字符的字符串:"GGUUW" const filteredStr = input.replace(new RegExp(`[^${safeKeepChars}]`, 'g'), '');去除重复字符
用正向预查匹配后续仍会出现的重复字符,全局替换为空,仅保留首次出现的字符。// 去重后得到目标结果:"GUW" const finalResult = filteredStr.replace(/(.)(?=.*\1)/g, '');
合并简化版
将两步操作合并,减少中间变量:
const input = "{1}{G}{G}{U}{U}{W}"; const keepChars = "GUW"; const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const result = input .replace(new RegExp(`[^${escapeRegExp(keepChars)}]`, 'g'), '') .replace(/(.)(?=.*\1)/g, ''); console.log(result); // 输出:GUW
正则说明
[^${safeKeepChars}]:反向字符集,匹配所有不在保留字符列表中的内容,替换为空后彻底清除数字、括号等无关字符。(.)(?=.*\1):(.)捕获单个字符,(?=.*\1)正向预查确保该字符在后续位置重复出现,替换这些重复的前置字符后,仅保留每个字符的第一次出现。
内容的提问来源于stack exchange,提问作者Howard
相关产品推荐
相关产品推荐

