我想在特定的开始和结束索引处替换字符串,
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);
我写了一段代码,仅替换了最后一场比赛,我缺少一些预定义的方法吗?
答案 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
'.slice
和matches
属性:
Start