2015-11-03 36 views
1

我想在一个字符串替换多个范围,例如:在一个字符串

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

你正在替换检查索引而不是字符串内容(正则表达式)的任何原因? – ryanyuyu

+0

最简单的解决方案是从* end *开始。这就是为什么你循环删除从列表中的元素从结尾开始倒数到0。也就是说,正则表达式是比脆弱索引更好的选择*和*不会创建临时字符串 –

+0

@ryanyuyu:是的,我只知道索引+内容可能在文件内多次(它们不像“XXX”那样很好标记,它们更像是随机索引)。 –

回答

1

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

+0

谢谢PanagiotisKanavos已经暗示了解决方案。我会给他/她两天的时间来回答这个问题来收集声誉。如果他/她没有回答你下一个问题的问题;-) –

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

这种方法的一个轻微的修改是将预先计算基础上的范围,最后一个字符串的长度。这样可以尽量减少不必要的分配,如果您有很多范围,这可能很重要。