我想替换字符串中的多个范围,例如:
Original string: "My XXX XXX is Y"
Range 1: Start=3, Length=3, Replacement=house
Range 2: Start=14, Length=1, Replacement=big
Desired output: "My house XXX is big"
如何使用.NET和C#做到这一点?我试图一次替换一个范围,但是,如果替换字符串的长度与其范围不同,则会破坏索引。 我只知道指数和范围内替换的字符串不唯一。我是否真的必须一直手动更新所有这些索引,还是有内置的方法来做到这一点?
答案 0 :(得分:1)
请从最后一个索引开始执行替换 - 从最右边的字符串到最左边的字符串。现在您不需要更新任何索引。就这么简单。
答案 1 :(得分:0)
一种方法是将结果逐个构建到StringBuilder
中。这样,你手头就有了原始字符串,所以你可以使用原始索引:
static string ReplaceRanges(string original, IEnumerable<Range> ranges)
{
var result = new StringBuilder(original.Length);
int index = 0;
foreach (var range in ranges)
{
result.Append(original, index, range.Start - index);
result.Append(range.Replacement);
index = range.Start + range.Length;
}
result.Append(original, index, original.Length - index);
return result.ToString();
}
对此方法的略微修改是根据范围预先计算最终字符串的长度。这样可以最大限度地减少不必要的分配,如果你有很多范围,这可能很重要。