在特定的开始结束位置替换字符串javascript

时间:2018-10-28 19:22:30

标签: javascript string ecmascript-6 substring

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

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);

我写了一段代码,仅替换了最后一场比赛,我缺少一些预定义的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:1)

问题在于procedure TClientThread.Execute; type PTBytes = ^TBytes; PTIdBytes = ^TIdBytes; var LBuffer : TIdBytes; LDataSize : Integer; LProtocol : TProtocol; procedure AddToMemo(const AStr: string); begin TThread.Synchronize(nil, procedure begin Form1.Memo1.Lines.Add('Received From Server: ' + AStr); end ); end; begin inherited; while NOT Terminated and Form1.IdTCPClient1.Connected do begin //LDataSize := Form1.IdTCPClient1.IOHandler.InputBuffer.Size; //if LDataSize >= szProtocol then begin try Form1.IdTCPClient1.IOHandler.ReadBytes(LBuffer, szProtocol); LProtocol := BytesToProtocol(PTBytes(@LBuffer)^); case LProtocol.Command of cmdHWID: begin HWID := LProtocol.Sender.HWID; AddToMemo('HWID > ' + LProtocol.Sender.HWID); end; cmdDisconnect: begin AddToMemo('DC > ' + LProtocol.Sender.HWID); end; cmdMensagem: begin AddToMemo('MSG > ' + LProtocol.Sender.Msg); end; end; finally ClearBufferId(LBuffer); end; //end; Sleep(50); end; end; 意味着所得的str1 = str.slice...<other manipulations of str>仅取决于str1是什么,而不取决于先前的str。因此,如果您在第一次迭代中重新分配str1,然后在第二次迭代中重新分配它,则第二个版本将不包含在第一个版本中所做的任何更改。

要解决此问题,您可以将str1 从最大的matches到最小的Start 进行迭代,而不要反而在{{ 1}}修改 字符串,这将确保新插入的文本不会破坏您的Start'.slicematches属性:

Start

相关问题