如何按位置替换部分字符串?

Gal*_*ali 143 c# string replace

我有这个字符串: ABCDEFGHIJ

我需要用字符串从位置4替换到位置5 ZX

它看起来像这样: ABCZXFGHIJ

但不要使用string.replace("DE","ZX")- 我需要使用位置

我该怎么做?

Alb*_*nbo 185

在字符串中添加和删除范围的最简单方法是使用StringBuilder.

var theString = "ABCDEFGHIJ";
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "ZX");
theString = aStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用String.Substring,但我认为StringBuilder代码更具可读性.

  • 会在扩展方法中更好地包装:) (5认同)
  • 如果您以与 V4Vendetta 相同的方式调用 Remove 和 Insert,但他直接在字符串上执行此操作,那么在此处使用 StringBuilder 有什么意义?似乎是多余的代码。 (3认同)
  • 为什么在这里使用 StringBuilder?检查 V4Vendetta 的答案,它更具可读性... (2认同)
  • @Fortega Remove() 和 Insert() 分别创建并返回一个新字符串。StringBuilder 方法通过在预先分配的内存部分中工作并在其中移动字符来避免这种额外成本。 (2认同)

V4V*_*tta 169

string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个,而不是初始化一个新的StringBuilder(...).谢谢! (16认同)
  • 我不知道为什么有人会使用stringbuilder进行此操作。这是个好答案 (2认同)

Nic*_*ler 40

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);
}
Run Code Online (Sandbox Code Playgroud)

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

"0123456789".ReplaceAt(7, 5, "Hello") = "0123456Hello"
Run Code Online (Sandbox Code Playgroud)

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

"0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789"
Run Code Online (Sandbox Code Playgroud)

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

"0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789"
Run Code Online (Sandbox Code Playgroud)

我想这更有效,因为StringBuilder类不需要初始化,因为它使用更多的基本操作.如果我错了,请纠正我.:)

  • 如果字符串长于200个字符,Stringbuilder会更有效. (5认同)

Dan*_*dor 9

使用String.Substring()(此处详细信息)剪切左侧部分,然后更换,然后右侧部​​分.玩索引,直到你正确:)

就像是:

string replacement=original.Substring(0,start)+
    rep+original.Substring(start+rep.Length);
Run Code Online (Sandbox Code Playgroud)

  • 我使用上面三种方法创建了三个方法(string.Remove/Insert,Stringbuilder.Remove/Insert和Daniel的Substring答案,SubString是最快的方法. (2认同)

svi*_*ick 8

如果您关心性能,那么您在这里要避免的是分配。如果您使用的是 .Net Core 2.1+(或尚未发布的 .Net Standard 2.1),那么您可以使用以下string.Create方法

public static string ReplaceAt(this string str, int index, int length, string replace)
{
    return string.Create(str.Length - length + replace.Length, (str, index, length, replace),
        (span, state) =>
        {
            state.str.AsSpan().Slice(0, state.index).CopyTo(span);
            state.replace.AsSpan().CopyTo(span.Slice(state.index));
            state.str.AsSpan().Slice(state.index + state.length).CopyTo(span.Slice(state.index + state.replace.Length));
        });
}
Run Code Online (Sandbox Code Playgroud)

这种方法比其他方法更难理解,但它是唯一一种每次调用只分配一个对象的方法:新创建的字符串。


aly*_*lid 7

作为一种扩展方法.

public static class StringBuilderExtension
{
    public static string SubsituteString(this string OriginalStr, int index, int length, string SubsituteStr)
    {
        return new StringBuilder(OriginalStr).Remove(index, length).Insert(index, SubsituteStr).ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)


Jav*_*ram 5

        string s = "ABCDEFG";
        string t = "st";
        s = s.Remove(4, t.Length);
        s = s.Insert(4, t);
Run Code Online (Sandbox Code Playgroud)