替换字符串中的多个范围

时间:2015-11-03 13:42:30

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

2 个答案:

答案 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();
}

对此方法的略微修改是根据范围预先计算最终字符串的长度。这样可以最大限度地减少不必要的分配,如果你有很多范围,这可能很重要。