如何取代部分string的位置?

我有这个string: ABCDEFGHIJ

我需要用stringZX从位置4replace到位置5

它将如下所示: ABCZXFGHIJ

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

我该怎么做?

在string中添加和删除范围的最简单方法是使用StringBuilder

 var theString = "ABCDEFGHIJ"; var aStringBuilder = new StringBuilder(theString); aStringBuilder.Remove(3, 2); aStringBuilder.Insert(3, "ZX"); theString = aStringBuilder.ToString(); 

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

 string s = "ABCDEFGH"; s= s.Remove(3, 2).Insert(3, "ZX"); 

ReplaceAt(int索引,int长度,stringreplace)

这是一个不使用StringBuilder或者Substring的扩展方法。 此方法还允许replacestring延伸超过源string的长度。

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

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

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

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

 "0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789" 

如果你指定长度为0,那么这个函数的作用就像插入函数一样:

 "0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789" 

我猜这是更高效的,因为StringBuilder类不需要初始化,因为它使用更多的基本操作。 如果我错了,请纠正我。 🙂

使用String.Substring() (细节在这里 )剪切左边的部分,然后你的replace,然后右边的部分。 玩索引,直到你得到它的权利:)

就像是:

 string replacement=original.Substring(0,start)+ rep+original.Substring(start+rep.Length); 
  string s = "ABCDEFG"; string t = "st"; s = s.Remove(4, t.Length); s = s.Insert(4, t); 

作为扩展方法。

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

你可以试试这个链接:

 string str = "ABCDEFGHIJ"; str = str.Substring(0, 2) + "ZX" + str.Substring(5); 

像其他人提到的Substring()函数是有原因的:

 static void Main(string[] args) { string input = "ABCDEFGHIJ"; string output = input.Overwrite(3, "ZX"); // 4th position has index 3 // ABCZXFGHIJ } public static string Overwrite(this string text, int position, string new_text) { return text.Substring(0, position) + new_text + text.Substring(position + new_text.Length); } 

另外我对这个StringBuilder解决scheme进行了计时,得到了900个vs 875.所以它稍微慢了一点。

完后还有

  public static string ReplaceAtPosition(this string self, int position, string newValue) { return self.Remove(position, newValue.Length).Insert(position, newValue); } 
 s.Remove(3, 2).Insert(3, "ZX"); 

– >如果string包含像Emojis这样的Unicode字符,这不起作用。

有了这个话题 ,我把StringInfo类扩展为Replace,保留Nick Miller的algorithm:

 public static class StringInfoUtils { public static string ReplaceByPosition(this string str, string replaceBy, int offset, int count) { return new StringInfo(str).ReplaceByPosition(replaceBy, offset, count).String; } public static StringInfo ReplaceByPosition(this StringInfo str, string replaceBy, int offset, int count) { return str.RemoveByTextElements(offset, count).InsertByTextElements(offset, replaceBy); } public static StringInfo RemoveByTextElements(this StringInfo str, int offset, int count) { return new StringInfo(string.Concat( str.SubstringByTextElements(0, offset), offset + count < str.LengthInTextElements ? str.SubstringByTextElements(offset + count, str.LengthInTextElements - count - offset) : "" )); } public static StringInfo InsertByTextElements(this StringInfo str, int offset, string insertStr) { if (string.IsNullOrEmpty(str?.String)) return new StringInfo(insertStr); return new StringInfo(string.Concat( str.SubstringByTextElements(0, offset), insertStr, str.LengthInTextElements - offset > 0 ? str.SubstringByTextElements(offset, str.LengthInTextElements - offset) : "" )); } } 

在这篇文章的帮助下,我创build了附加长度检查的以下function

 public string ReplaceStringByIndex(string original, string replaceWith, int replaceIndex) { if (original.Length >= (replaceIndex + replaceWith.Length)) { StringBuilder rev = new StringBuilder(original); rev.Remove(replaceIndex, replaceWith.Length); rev.Insert(replaceIndex, replaceWith); return rev.ToString(); } else { throw new Exception("Wrong lengths for the operation"); } } 

最好使用String.substr()

喜欢这个:

 ReplString = GivenStr.substr(0, PostostarRelStr) + GivenStr(PostostarRelStr, ReplString.lenght()); 

我相信最简单的方法是这样的:(没有stringbuilder)

 string myString = "ABCDEFGHIJ"; char[] replacementChars = {'Z', 'X'}; byte j = 0; for (byte i = 3; i <= 4; i++, j++) { myString = myString.Replace(myString[i], replacementChars[j]); } 

这是可行的,因为stringtypes的variables可以被看作是一个charvariables的数组。 例如,可以将名称为“myString”的stringvariables的第二个字符称为myString [1]