JavaScript实现字符按重复规则替换代码不生效问题求助
问题原因定位
- 第一,正则表达式写法错误:你写的
/word[i]/gi是把word[i]当作固定字符串字面量处理,不会解析成变量对应的值,所以replace方法全程匹配不到任何字符,自然不会修改原字符串,这是你得到原输入的直接原因。 - 第二,循环逻辑错误:双重循环过程中每次比对单个j就直接替换全局字符,哪怕后续存在重复字符也会被前面的判断覆盖,而且你在循环中修改了原字符串
word,后续遍历的是修改后的内容,统计重复的逻辑完全失效。 - 第三,判断时机错误:应该先全局统计所有字符的出现次数,再统一替换,而不是边遍历边修改。
修复方案
首先先统计每个字符的出现频次,再遍历原字符串按规则替换,示例代码如下:
function duplicateEncode(word){ // 统一转小写,匹配原代码的gi忽略大小写逻辑 const lowerWord = word.toLowerCase(); // 统计字符出现次数 const countMap = {}; for (let char of lowerWord) { countMap[char] = (countMap[char] || 0) + 1; } // 按规则替换 return lowerWord.split('').map(char => { return countMap[char] === 1 ? '(' : ')'; }).join(''); }
如果你一定要用正则动态匹配的写法,需要用RegExp构造函数来传入变量生成正则,比如new RegExp(word[i], 'gi'),但依然不推荐边遍历边修改原字符串的逻辑,很容易出现索引错乱问题。
内容的提问来源于stack exchange,提问作者IG-_-
相关产品推荐
相关产品推荐

