C# 替换字符串中的多个范围

C# 替换字符串中的多个范围,c#,.net,string,C#,.net,String,我想替换字符串中的多个范围,例如: 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#实现这一点?我试图一次替换一个范围,但是,如果替换字符串的长度与其范围不同,则会破坏索引我只知道索引,范围中替

我想替换字符串中的多个范围,例如:

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#实现这一点?我试图一次替换一个范围,但是,如果替换字符串的长度与其范围不同,则会破坏索引我只知道索引范围中替换的字符串不是唯一的。我真的必须一直手动更新所有这些索引吗?还是有一种内置的方法可以做到这一点

请从最后一个索引开始执行替换-从最右边的字符串到最左边的字符串。现在您不需要更新任何索引。很简单。

一种方法是将结果逐段构建到
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();
}
静态字符串替换范围(字符串原始、IEnumerable范围)
{
var结果=新的StringBuilder(原始长度);
int指数=0;
foreach(范围中的var范围)
{
追加(原始、索引、范围、开始-索引);
结果.追加(范围.替换);
索引=范围.开始+范围.长度;
}
追加(原始、索引、原始、长度-索引);
返回result.ToString();
}

该方法的一个轻微修改是基于范围预计算最终字符串的长度。这将最大限度地减少不必要的分配,如果您有多个范围,这一点可能很重要。

您通过检查索引而不是字符串内容(regex)来替换的任何原因?最肮脏的解决方案是从末尾开始。这就是为什么要从列表中删除元素的循环从末尾开始,然后倒计时到0。也就是说,正则表达式比脆弱索引更好,而且不会创建临时索引strings@ryanyuyu:是的,我只知道索引+内容可能在文件中多次出现(它们不像“XXX”标记得那么好,它们更像是随机索引)。@PanagiotisKanavos:嗯,听起来还不错。我试试看!这不是一个简洁的实用函数,但您可以使用StringBuilder将一组子字符串连接在一起。您必须编写循环/替换规则。谢谢,PanagiotisKanavos已经暗示了解决方案。我会给他/她两天时间通过回答问题来收集声誉。如果他/她没有回答问题,你就是下一个问题;-)