【问题标题】:Replace string at specific start end positions javascript在特定的开始结束位置替换字符串javascript
【发布时间】:2026-02-17 08:50:01
【问题描述】:

我想替换特定开始和结束索引处的字符串,

str = `kunal 11 12 13 kunal 11 12`;

matches = [{
    Start: 0,
    End: 10
  },
  {
    Start: 15,
    End: 26
  }
];

str1 = '';
for (i = 0; i < matches.length; i++) {
  str1 = str.slice(0, matches[i].Start) +
         `<span>${str.substring(matches[i].Start, matches[i].End)}</span>` +
          str.slice(matches[i].End);
}

console.log(str1);

我写了一段代码,只是替换最后一个匹配项,是否有一些我缺少的预定义方法?

【问题讨论】:

  • str1 = ... 您正在覆盖以前的值。
  • @undefined javascript中是否有一些预构建的方法可以在范围内替换?

标签: javascript string ecmascript-6 substring


【解决方案1】:

问题在于str1 = str.slice...&lt;other manipulations of str&gt; 意味着生成的str1 仅取决于str 是什么,而不取决于str1 以前可能是什么。因此,如果您在第一次迭代中重新分配 str1,然后在第二次迭代中重新分配它,那么第二个版本将不会包含在第一个版本中所做的任何更改。

要修复它,您可以迭代 matches 从最大的 Start 到最小的 Start,而不是反过来,而 .sliceing 修改 字符串,这将确保新插入的文本不会破坏您的matches'StartEnd 属性:

const input = `kunal 11 12 13 kunal 11 12`;
const matches = [{
    Start: 0,
    End: 10
  },
  {
    Start: 15,
    End: 26
  }
];
let str = input;
for (let i = matches.length - 1; i >= 0; i--) {
  str = str.slice(0, matches[i].Start) + `<span>${str.substring(matches[i].Start, matches[i].End)}</span>` + str.slice(matches[i].End);
}

console.log(str);

【讨论】:

  • To fix it, you might iterate over matches from the largest Start to the smallest Start, rather than the other way around, while .sliceing the modified string, which will ensure that the new inserted text doesn't break your matches' Start and End properties:你能解释一下吗?
  • 看看新的for 循环如何从matches.length - 1 开始并向下迭代,而不是相反?没有它,对str 的初始更改会弄乱matches 中的所有剩余索引,例如jsfiddle.net/eprsd39v 你会得到&lt;span&gt;kunal 11 &lt;span&gt;1&lt;/span&gt;2 1&lt;/span&gt;3 kunal 11 12,因为第一次更改后的新"Start: 15" 不指同一点在str 中,"Start: 15" 最初是这样做的。所以,反过来,先改变字符串的结尾。
  • 这是一个非常聪明的技巧,我逐行调试了你的解决方案,它非常适合我,这种技术叫什么?
  • 不知道有没有它的名字,这只是我看到问题所在时想到的解决方案。
【解决方案2】:

您可以使用Array.reduceRight()template literal 来获得结果。 reduceRight 用str 初始化,在每次迭代中(从最后一个匹配到第一个),它获取字符串的先前状态,用匹配更新它,并返回结果。

const str = `kunal 11 12 13 kunal 11 12`;
const matches = [{ Start: 0, End: 10 }, { Start: 15, End: 26 }];

const result = matches.reduceRight((r, { Start: s, End: e }) =>
  `${r.substring(0, s)}<span>${r.substring(s, e)}</span>${r.substring(e)}`, str);

console.log(result);

【讨论】:

  • 确实非常聪明的解决方案,这个解决方案也不会改变原始字符串!