如何实现仅对指定字符(/、-、:)去除相邻重复项?
没问题!我来帮你修改这个方法,让它只针对/、-、:这三个字符处理相邻重复项,其他字符的连续重复会被完整保留~
解决方案
我们有两种实用的方式来实现这个需求,你可以根据自己的习惯选择:
方法一:正则表达式(简洁高效)
正则表达式可以快速匹配目标字符的连续重复项,并用单个字符替换。核心思路是只捕获/、-、:的连续重复序列,其他字符完全不处理。
代码示例
function singleOccurrence(str) { // 正则说明: // ([\/\-:]) 捕获组:匹配 /、-、: 中的任意一个 // \1+ 匹配和捕获组相同的连续重复字符 // g 全局匹配,替换所有符合条件的序列 return str.replace(/([\/\-:])\1+/g, '$1'); }
测试验证
singleOccurrence("1//2/2018")→ 返回"1/2/2018"singleOccurrence("11//2/2018")→ 返回"11/2/2018"(数字1的连续重复被保留)singleOccurrence("2024--05::20")→ 返回"2024-05:20"singleOccurrence("aa--bb::cc")→ 返回"aa-bb:cc"(字母的连续重复被保留)
方法二:字符串遍历(直观可控)
如果你不想用正则,或者需要更精细的逻辑控制,可以通过遍历字符串的方式实现。核心思路是逐个检查字符,仅当当前字符是目标字符且和上一个字符重复时跳过。
代码示例
function singleOccurrence(str) { // 用Set存储需要去重的目标字符,方便快速判断 const targetChars = new Set(['/', '-', ':']); const result = []; for (const char of str) { // 只有当当前字符是目标字符,且和结果最后一个字符相同时,才跳过添加 if (targetChars.has(char) && result.at(-1) === char) { continue; } result.push(char); } return result.join(''); }
逻辑解释
- 用
Set存储目标字符,判断字符是否属于去重范围的效率更高 - 遍历输入字符串的每个字符
- 如果当前字符是目标字符,且和结果数组的最后一个字符重复,就跳过该字符
- 否则将字符添加到结果数组,最后拼接成字符串返回
这个方法逻辑清晰,后续如果需要调整目标字符,只需要修改targetChars集合即可。
内容的提问来源于stack exchange,提问作者Luke C
相关产品推荐
相关产品推荐

