【问题标题】:Javascript: Replace repeated character in a string?Javascript:替换字符串中的重复字符?
【发布时间】:2020-12-19 16:29:47
【问题描述】:

我一直在解决代码战中的 katas,但偶然发现了一个我似乎无法找到答案的一般代码问题。

这是我的代码:

function wave(str) {
   let arr = [];
   for (var i = 0; i < str.length; i++) {
       str[i].match(/\S/) && arr.push(str.replace(str[i], str[i].toUpperCase()));
   }
   return arr;
 };

(注意:输入总是小写。) 在wave("abc def"); 的情况下,代码完全符合我的要求:

["Abc def", "aBc def", "abC def", "abc Def", "abc dEf", "abc deF"]

=> 函数接受一个字符串,将字符串中从str[0]开始的一个字母大写,将新单词推入arr,递增i并重复过程直到i &lt; str.length,然后返回arr结果。

但是,例如,如果我输入 wave("acc def");,则只有第一次出现的字母 c 会返回大写:

["Acc def", "aCc def", "aCc def", "acc Def", "acc dEf", "acc deF"]

问题:为什么它会“跳转”第二次出现的“c”以及如何定位字符串中第二次或第 n 次出现的字符?

【问题讨论】:

  • "只有第一次出现" ~ 尝试全局匹配/\S/g ?
  • str.replace(str[i], ...) 只会替换str[i] 处字符的第一次出现(因此它也不适用于cac def
  • str[i] (.slice()) 的左边部分,取str[i] 的大写版本,取str[i] (.slice()) 的右边部分——再次组合它们跨度>

标签: javascript string regexp-replace


【解决方案1】:

str.replace("x", "y")str 中第一次出现的"x" 替换为"y"
如果字符串中只有唯一字符,则您的方法有效,但是当有重复字符时,它将失败,例如"acc def"

你可以将.slice()字符串分成三部分:

  • i 左边的部分 -> .slice(0, i)
  • 索引处的字符i -> str[i]
  • 索引后的剩余部分i -> .slice(i + 1)

根据需要修改str[i],并将它们与.join("")组合回一个字符串

function wave(str) {
  const result = [];
  
  for (let i = 0; i < str.length; i++) {
    if (!str[i].match(/\S/)) continue;
    
    result.push([
                  str.slice(0, i),      /* the part left of str[i] */
                  str[i].toUpperCase(), /* str[i] */
                  str.slice(i + 1)      /* the remaining part right of str[i] */
                ].join(""))  // combine the parts in the array into a string
  }
  
  return result;
 };
 
 
 console.log(JSON.stringify(wave("abc def")));
 console.log(JSON.stringify(wave("acc def")));

【讨论】:

    【解决方案2】:

    当您说str.replace(str[i], str[i].toUpperCase()) 时,您是在说:“将第一次出现的str[i] 替换为str[i].toUpperCase()”,这正是您的程序正在做的事情。

    考虑像这样构建你的新字符串:

    str.substring(0, i) + str[i].toUpperCase() + str.substring(i+1)
    

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2012-07-23
      • 2011-10-10
      • 2021-06-17
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多