C#用起始位置和结束位置替换字符串的一部分

时间:2011-06-27 18:42:45

标签: c# string replace

我有一个字符串,我想替换它的一部分。 棘手的部分是我不能使用Regex.replace,因为我只知道字符串中数据的开始和结束位置。 例如,如果字符串如下所示:

I love cats, some more stuff here, we dont know how much more

我有start=8end=11。我想把那部分替换成我需要的东西。这一次让我们说dogs所以新字符串将如下所示:

I love dogs, some more stuff here, we dont know how much more

我怎么能这样做?

6 个答案:

答案 0 :(得分:21)

最简单的方法:

string replaced = original.Substring(0, start) + replacementText + 
                  original.Substring(end);

我原本期望StringBuilder能够做到这一点,但我认为你必须先致电Remove然后Insert

答案 1 :(得分:6)

str.Substring(0, 8) + "replacement" + str.Substring(11);

它并不“优雅”,但它有效。

答案 2 :(得分:1)

ReplaceAt(int index,int length,string replace)

这是一个不使用StringBuilder或Substring的扩展方法。此方法还允许替换字符串延伸超过源字符串的长度。

//// str - the source string
//// index- the start location to replace at (0-based)
//// length - the number of characters to be removed before inserting
//// replace - the string that is replacing characters
public static string ReplaceAt(this string str, int index, int length, string replace)
{
    return str.Remove(index, Math.Min(length, str.Length - index))
            .Insert(index, replace);
}

使用此函数时,如果希望整个替换字符串替换尽可能多的字符,则将length设置为替换字符串的长度:

"0123456789".ReplaceAt(7, 5, "Salut") = "0123456Salut"

否则,您可以指定要删除的字符数量:

"0123456789".ReplaceAt(2, 2, "Salut") = "01Salut456789"

如果指定长度为0,则此函数的作用与插入函数类似:

"0123456789".ReplaceAt(4, 0, "Salut") = "0123Salut456789"

我想这更有效率,因为StringBuilder类不需要初始化,因为它使用更多的基本操作。 希望这个帮助

答案 3 :(得分:0)

string newString = 
 String.Concat(
        originalString.Substring(0, start),
        replacementText, 
        originalString.Substring(end));

OR

StringBuilder sb = new StringBuilder(originalString);
sb
  .Remove(start, length)
  .Insert(start, replacementText);

答案 4 :(得分:0)

只是为了LINQ的乐趣:

const string S = "I love cats, some more stuff here, we dont know how much more";
const string Dogs = "dogs";

var res = S
    .Take(7)
    .Concat(Dogs)
    .Concat(S.Where((c, i) => i > 10));

var resultString = string.Concat(res);

答案 5 :(得分:0)

不优雅但有趣的解决方案:

string myString = "I love cats, some more stuff here, we dont know how much more";

        Regex expr = new Regex("cats");
        int start = 8;
        int end = 11;
        Match m =expr.Match(myString);
        if (m.Index == start-1 && m.Length == end - (start-1))
        {
            Console.WriteLine(expr.Replace(myString, "dogs")); 
        }