如何取代部分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]