JavaScript字符串处理:如何定位首个特殊符号插入对应指示器
字符串特殊符号标记处理实现方案
需求梳理
- 输入为字符串数组,每个字符串可能包含
$、%、*三种特殊符号,也可能不包含任何目标符号 - 所有字符串分为5类场景:
- 不包含任何
$/%/*符号 - 同时包含
$和%两种符号 - 仅包含
$符号 - 仅包含
%符号 - 仅包含
*符号
- 不包含任何
- 处理规则:
- 无目标符号的字符串不做处理,直接返回
- 包含目标符号的字符串,需要在整句第一个出现的目标符号左侧插入对应类型的指示器,处理示例:
原句(同时含$和%):
I would $rather %be $happy, %if working in a chocolate factory
处理后:I would ---dollorAndperSign—-$rather %be $happy, %if working in a chocolate factory
原句(仅含$):Tennis $is a good sport
处理后:Tennis --dollorSign—-$is a good sport
核心问题解决思路
索引判断出错的原因是indexOf查找失败时返回-1,比所有合法索引(≥0)都小,会干扰最小值判断。解决方法非常简单:把不存在的符号对应的索引值替换为Infinity(正无穷),所有合法索引都小于Infinity,再对比三个值的最小值就能精准定位第一个出现的符号位置。
完整实现代码
const processedTexts = texts.map((text) => { // 分别获取三个符号的索引 const dollarIdx = text.indexOf("$"); const perIdx = text.indexOf("%"); const starIdx = text.indexOf("*"); // 不存在的符号索引替换为Infinity,避免干扰最小值判断 const signList = [ { type: "$", index: dollarIdx === -1 ? Infinity : dollarIdx }, { type: "%", index: perIdx === -1 ? Infinity : perIdx }, { type: "*", index: starIdx === -1 ? Infinity : starIdx } ]; // 无任何目标符号直接返回原文本 if (signList.every(item => item.index === Infinity)) return text; // 按索引升序排序,取第一个就是最先出现的符号位置 const firstSign = signList.sort((a, b) => a.index - b.index)[0]; const insertPosition = firstSign.index; // 匹配对应场景的指示器 let insertIndicator = ""; const hasDollar = dollarIdx !== -1; const hasPercent = perIdx !== -1; const hasStar = starIdx !== -1; if (hasDollar && hasPercent) { insertIndicator = "---dollorAndperSign--"; } else if (hasDollar) { insertIndicator = "--dollorSign--"; } else if (hasPercent) { insertIndicator = "--perSign--"; } else if (hasStar) { insertIndicator = "--starSign--"; } // 切片拼接,在目标位置插入指示器 return text.slice(0, insertPosition) + insertIndicator + text.slice(insertPosition); });
逻辑说明
- 用
Infinity替代不存在符号的-1索引,不需要额外写复杂的过滤逻辑,排序时自动跳过不存在的符号,判断逻辑简洁无bug - 先判断文本包含的符号类型再匹配指示器,完全覆盖列出的5种场景,即便出现三个符号同时存在的边缘情况,也会优先匹配「同时含$和%」的规则,符合需求
- 字符串切片拼接的方式不会改动原文本其他内容,插入位置精准,性能优于正则替换方案
内容的提问来源于stack exchange,提问作者user15608655
相关产品推荐
相关产品推荐

