¿Cómo reemplazar parte de la cuerda por posición?
Tengo esta cadena:ABCDEFGHIJ
Necesito reemplazar de la posición 4 a la posición 5 con la cuerdaZX
Se verá así:ABCZXFGHIJ
Pero no para usar con string.replace("DE","ZX")
- necesito usar con posición
¿Cómo puedo hacerlo?
string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");
La forma más sencilla de agregar y eliminar rangos en una cadena es utilizar el archivo 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 StringBuilder
código se vuelve más legible.
Reemplazar en (índice int, longitud int, reemplazo de cadena)
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 de origen.
//// 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 en 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 sea 0, entonces 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 no es necesario inicializar la clase StringBuilder y utiliza operaciones más básicas. Por favor, corríjame si estoy equivocado. :)
Si le importa el rendimiento, lo que debe evitar aquí son las asignaciones. Y si estás en .Net Core 2.1+, entonces puedes hacerlo usando el string.Create
método :
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));
});
}
Este enfoque es más difícil de entender que las alternativas, pero es el único que asignará sólo un objeto por llamada: la cadena recién creada.