JavaScript字符串简化函数优化:保留指定特殊符号
解决方案
要实现保留指定符号的字符串简化,核心是优先匹配并保留长符号,避免短符号拆分长符号(比如...不能被拆成三个.),再对其余无关内容进行处理。具体实现如下:
实现思路
- 排序符号数组:将符号按长度从长到短排序,确保长符号先被匹配(比如
!!、...这类多字符符号优先于单个!、.)。 - 构建安全正则:转义符号中的正则特殊字符,避免解析错误;用捕获组区分「保留符号」和「其他字符」。
- 分场景处理:匹配到保留符号直接保留,其余非目标字符(字母、数字、
'、_)替换为空格,最后统一转小写并清理多余空格。
完整代码
const signs = ['!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', ':']; // 按符号长度降序排序,确保长符号优先被匹配 const sortedSigns = [...signs].sort((a, b) => b.length - a.length); // 转义正则特殊字符,避免符号中的.、?等干扰正则解析 const escapedSigns = sortedSigns.map(sign => sign.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); // 构建正则:要么匹配保留符号,要么匹配非目标字符 const signRegex = new RegExp(`(${escapedSigns.join('|')})|[^A-Za-z0-9'_]`, 'g'); function simplify(string) { return string .toLowerCase() .replace(signRegex, (match, capturedSign) => { // 匹配到保留符号则直接返回,否则替换为空格 return capturedSign ? capturedSign : ' '; }) .replace(/\s+/g, ' ') // 合并连续的多余空格 .trim(); // 清理首尾空格 } // 测试示例 console.log(simplify(' The very optiMal! FUNCTION, {here] ...')); // 输出:"the very optimal! function here ..." console.log(simplify('Hello?! World.. How are you؟!')); // 输出:"hello?! world.. how are you؟!"
关键细节说明
- 符号排序:比如
...会比.先被匹配,避免长符号被拆成单个字符处理后丢失原有格式。 - 正则转义:像
.、?这类在正则中有特殊含义的符号,必须转义后才能作为普通字符匹配。 - 空格清理:最后用
/\s+/g合并连续空格,保证处理后的字符串格式整洁。
内容的提问来源于stack exchange,提问作者Sara Ree
相关产品推荐
相关产品推荐

