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

12

我可以替换一个字符串的一部分,但是有个棘手的问题,因为我只知道字符串中数据的起始位置和结束位置,所以无法使用Regex.replace函数。例如,如果字符串如下:

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

我有一个字符串,其中一部分是从第8个字符到第11个字符。现在我想将这一部分替换为需要的内容。这次假设我想把它替换为dogs,那么新的字符串将看起来像:

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

我该如何做到这一点?


2
哦,等等,那是旧的VB/VBA。不过它非常简洁,很有趣。 mid$(myString, 9, 12) = "dogs" - agent-j
可能是如何通过位置替换字符串的一部分?的重复问题。 - joce
这个回答解决了你的问题吗?如何根据位置替换字符串的一部分? - malat
6个回答

23

最简单的方法:

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

我原本以为 StringBuilder 有可以做到这个的方法,但我认为你必须先调用 Remove 然后再调用 Insert


如何对字符串执行“删除”然后“插入”操作呢? - Gabe
@Gabe:是的,那样做可以行 - 我认为它会减少中间字符串值,但会增加更多的复制。我认为我也会发现这段代码更容易理解 :) - Jon Skeet

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

这不是“优雅”,但它有效。

2

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

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

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

否则,您可以指定要删除的字符数量:
"0123456789".ReplaceAt(2, 2, "Salut") = "01Salut456789"

如果您将长度指定为0,则此函数的作用就像插入函数一样:
"0123456789".ReplaceAt(4, 0, "Salut") = "0123Salut456789"

我认为这种方式更加高效,因为StringBuilder类不需要初始化,并且使用更基本的操作。希望这可以帮到你。

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

或者

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

你为什么要使用 StringBuilder? - Gabe
StringBuilder 会稍微快一点。 String.Concat 也在内部使用它。然而,对于三个字符串连接的情况,简单的 '+' 可以更快 - 因此,在更改字符串时,使用 StringBuilder 而不是 string 只是一个好习惯。 - Arthur P

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接