¿Cómo reemplazar parte de la cuerda por posición?

Tengo esta cadena: ABCDEFGHIJ

Necesito reemplazar desde la posición 4 a la posición 5 con la cadena ZX

Se verá así: ABCZXFGHIJ

Pero no para usar con string.replace("DE","ZX") – Necesito usar con posición

¿Cómo puedo hacerlo?

La forma más fácil de agregar y eliminar rangos en una cadena es usar StringBuilder .

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

Una alternativa es usar String.Substring , pero creo que el código de StringBuilder vuelve más legible.

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

ReplaceAt (int index, int length, string replace)

Aquí hay un método de extensión que no usa StringBuilder o Substring. Este método también permite que la cadena de reemplazo se extienda más allá de la longitud de la cadena fuente.

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

Al utilizar esta función, si desea que toda la cadena de reemplazo reemplace tantos caracteres como sea posible, establezca la longitud a la longitud de la cadena de reemplazo:

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

De lo contrario, puede especificar la cantidad de caracteres que se eliminarán:

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

Si especifica que la longitud es 0, esta función actúa igual que la función de inserción:

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

Supongo que esto es más eficiente ya que la clase StringBuilder no necesita ser inicializada y porque usa más operaciones básicas. Por favor, corríjame si estoy equivocado. 🙂

Use String.Substring() (detalles aquí ) para cortar la parte izquierda, luego su reemplazo, luego la parte derecha. Juega con índices hasta que lo hagas bien 🙂

Algo como:

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

Como un método de extensión.

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

Puedes intentar algo vincular esto:

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

Al igual que otros han mencionado, la función Substring() está ahí por una razón:

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

También cronometré esto contra la solución StringBuilder y obtuve 900 tics contra 875. Por lo tanto, es un poco más lento.

Con la ayuda de esta publicación, creo la siguiente función con verificaciones de longitud adicionales

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

Aún otra

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

-> Esto no funciona si string contiene caracteres Unicode como Emojis.

Con este tema , extiendo la clase StringInfo a Reemplazar por posición manteniendo el algoritmo de Nick Miller:

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

Es mejor usar String.substr() .

Me gusta esto:

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

Estaba buscando una solución con los siguientes requisitos:

  1. use solo una expresión única de una línea
  2. use solo métodos integrados del sistema (sin utilidad personalizada implementada)

Solución 1

La solución que mejor se adapta a mí es esta:

 // replace `oldString[i]` with `c` string newString = new StringBuilder(oldString).Replace(oldString[i], c, i, 1).ToString(); 

Esto usa StringBuilder.Replace(oldChar, newChar, position, count)

Solución 2

La otra solución que satisface mis requisitos es usar Substring con concatenación:

 string newString = oldStr.Substring(0, i) + c + oldString.Substring(i+1, oldString.Length); 

Esto también está bien. Supongo que no es tan eficiente como el primero en cuanto a rendimiento (debido a la concatenación innecesaria de cadenas). Pero la optimización prematura es la raíz de todo mal .

Así que elige el que más te guste 🙂

Creo que la manera más simple sería esta: (sin un generador de cadenas)

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

Esto funciona porque una variable de tipo cadena se puede tratar como una matriz de variables char. Puede, por ejemplo, referirse al segundo carácter de una variable de cadena con el nombre "myString" como myString [1]