Procedimiento para modificar el contenido de cadenas en C#How to: Modify string contents in C#

En este artículo se muestran varias técnicas para producir una string modificando una string existente.This article demonstrates several techniques to produce a string by modifying an existing string. Todas las técnicas mostradas devuelven el resultado de las modificaciones como un objeto string nuevo.All the techniques demonstrated return the result of the modifications as a new string object. Para indicarlo de forma clara, en todos los ejemplos se almacena el resultado en una variable nueva.To clearly demonstrate this, the examples all store the result in a new variable. Entonces, podrá examinar tanto la string original como la string resultante de la modificación al ejecutar cada ejemplo.You can then examine both the original string and the string resulting from the modification when you run each example.

Nota

Los ejemplos de C# de este artículo se ejecutan en el ejecutor de código en línea y área de juegos de Try.NET.The C# examples in this article run in the Try.NET inline code runner and playground. Haga clic en el botón Ejecutar para ejecutar un ejemplo en una ventana interactiva.Select the Run button to run an example in an interactive window. Una vez que se ejecuta el código, puede modificar y ejecutar el código modificado si vuelve a hacer clic en Ejecutar.Once you execute the code, you can modify it and run the modified code by selecting Run again. El código modificado se ejecuta en la ventana interactiva o, si se produce un error en la compilación, en la ventana interactiva se muestran todos los mensajes de error del compilador de C#.The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

En este artículo se muestran varias técnicas.There are several techniques demonstrated in this article. Puede reemplazar el texto existente.You can replace existing text. Puede buscar patrones y reemplazar el texto coincidente por otro texto.You can search for patterns and replace matching text with other text. Puede tratar una cadena con una secuencia de caracteres.You can treat a string as a sequence of characters. También puede usar métodos de conveniencia para eliminar espacios en blanco.You can also use convenience methods that remove white space. Debe elegir la técnica con mayor coincidencia con su caso.You should choose the techniques that most closely match your scenario.

Reemplazo de textoReplace text

Con el código siguiente se crea una cadena mediante el reemplazo de texto con un sustituto.The following code creates a new string by replacing existing text with a substitute.

string source = "The mountains are behind the clouds today.";

// Replace one substring with another with String.Replace.
// Only exact matches are supported.
var replacement = source.Replace("mountains", "peaks");
Console.WriteLine($"The source string is <{source}>");
Console.WriteLine($"The updated string is <{replacement}>");

En el código anterior se muestra esta propiedad inmutable de las cadenas.The preceding code demonstrates this immutable property of strings. En el ejemplo anterior puede ver que la cadena original, source, no se ha modificado.You can see in the preceding example that the original string, source, is not modified. Con el método String.Replace se crea una string que contiene las modificaciones.The String.Replace method creates a new string containing the modifications.

Con el método Replace se pueden reemplazar cadenas o caracteres únicos.The Replace method can replace either strings or single characters. En ambos casos, se reemplazan todas las instancias del texto buscado.In both cases, every occurrence of the sought text is replaced. En el siguiente ejemplo se reemplazan todos los caracteres " " por "_":The following example replaces all ' ' characters with '_':

string source = "The mountains are behind the clouds today.";

// Replace all occurrences of one char with another.
var replacement = source.Replace(' ', '_');
Console.WriteLine(source);
Console.WriteLine(replacement);

La cadena de origen se mantiene y se devuelve una cadena nueva con los reemplazos.The source string is unchanged, and a new string is returned with the replacement.

Recorte de espacios en blancoTrim white space

Puede usar los métodos String.Trim, String.TrimStart, y String.TrimEnd para quitar los espacios en blanco al inicio y al final.You can use the String.Trim, String.TrimStart, and String.TrimEnd methods to remove any leading or trailing white space. En el código siguiente se muestra un ejemplo de cada caso.The following code shows an example of each. La cadena de origen no cambia; con estos métodos se devuelve una cadena nueva con el contenido modificado.The source string does not change; these methods return a new string with the modified contents.

// Remove trailing and leading white space.
string source = "    I'm wider than I need to be.      ";
// Store the results in a new string variable.
var trimmedResult = source.Trim();
var trimLeading = source.TrimStart();
var trimTrailing = source.TrimEnd();
Console.WriteLine($"<{source}>");
Console.WriteLine($"<{trimmedResult}>");
Console.WriteLine($"<{trimLeading}>");
Console.WriteLine($"<{trimTrailing}>");

Eliminación de textoRemove text

Puede quitar texto de una cadena con el método String.Remove.You can remove text from a string using the String.Remove method. Este método quita un número de caracteres que comienzan con un índice específico.This method removes a number of characters starting at a specific index. En el siguiente ejemplo se muestra cómo usar String.IndexOf seguido por Remove para quitar texto de una cadena:The following example shows how to use String.IndexOf followed by Remove to remove text from a string:

string source = "Many mountains are behind many clouds today.";
// Remove a substring from the middle of the string.
string toRemove = "many ";
string result = string.Empty;
int i = source.IndexOf(toRemove);
if (i >= 0)
{
    result= source.Remove(i, toRemove.Length);
}
Console.WriteLine(source);
Console.WriteLine(result);

Reemplazo de patrones de coincidenciaReplace matching patterns

Puede usar expresiones regulares para reemplazar texto que coincida con patrones por texto nuevo, posiblemente definido por un patrón.You can use regular expressions to replace text matching patterns with new text, possibly defined by a pattern. En el ejemplo siguiente se usa la clase System.Text.RegularExpressions.Regex para encontrar un patrón en una cadena de origen y reemplazarlo con un uso de mayúsculas y minúsculas adecuado.The following example uses the System.Text.RegularExpressions.Regex class to find a pattern in a source string and replace it with proper capitalization. Con el método Regex.Replace(String, String, MatchEvaluator, RegexOptions) se usa una función que proporciona la lógica del reemplazo de uno de los argumentos.The Regex.Replace(String, String, MatchEvaluator, RegexOptions) method takes a function that provides the logic of the replacement as one of its arguments. En este ejemplo, la función LocalReplaceMatchCase es una función local declarada dentro del método de ejemplo.In this example, that function, LocalReplaceMatchCase is a local function declared inside the sample method. LocalReplaceMatchCase usa la clase System.Text.StringBuilder para crear la cadena de reemplazo con un uso de mayúsculas y minúsculas adecuado.LocalReplaceMatchCase uses the System.Text.StringBuilder class to build the replacement string with proper capitalization.

Las expresiones regulares son más útiles al buscar y reemplazar texto que sigue un patrón, en vez de texto que ya conoce.Regular expressions are most useful for searching and replacing text that follows a pattern, rather than known text. Vea Cómo: Buscar cadenas para obtener más detalles.See How to: search strings for more details. Con el patrón de búsqueda "the\s" se busca la palabra "the" seguida de un carácter de espacio en blanco.The search pattern, "the\s" searches for the word "the" followed by a white-space character. Con esa parte del patrón se asegura de que no se busca "there" en la cadena de origen.That part of the pattern ensures that it doesn't match "there" in the source string. Para obtener más información sobre los elementos de lenguaje de expresiones regulares, vea Lenguaje de expresiones regulares - Referencia rápida.For more information on regular expression language elements, see Regular Expression Language - Quick Reference.

string source = "The mountains are still there behind the clouds today.";

// Use Regex.Replace for more flexibility. 
// Replace "the" or "The" with "many" or "Many".
// using System.Text.RegularExpressions
string replaceWith = "many ";
source = System.Text.RegularExpressions.Regex.Replace(source, "the\\s", LocalReplaceMatchCase, 
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Console.WriteLine(source);

string LocalReplaceMatchCase(System.Text.RegularExpressions.Match matchExpression)
{
    // Test whether the match is capitalized
    if (Char.IsUpper(matchExpression.Value[0]))
    {
        // Capitalize the replacement string
        System.Text.StringBuilder replacementBuilder = new System.Text.StringBuilder(replaceWith);
        replacementBuilder[0] = Char.ToUpper(replacementBuilder[0]);
        return replacementBuilder.ToString();
    }
    else
    {
        return replaceWith;
    }
}

Con el método StringBuilder.ToString se devuelve una cadena inmutable con el contenido del objeto StringBuilder.The StringBuilder.ToString method returns an immutable string with the contents in the StringBuilder object.

Modificación de caracteres individualesModifying individual characters

Puede producir un matriz de caracteres a partir de una cadena, modificar el contenido de la matriz y crear después una cadena a partir del contenido modificado de la matriz.You can produce a character array from a string, modify the contents of the array, and then create a new string from the modified contents of the array.

En el siguiente ejemplo se muestra cómo reemplazar un conjunto de caracteres en una cadena.The following example shows how to replace a set of characters in a string. En primer lugar, se usa el método ToCharArray() para crear una matriz de caracteres.First, it uses the ToCharArray() method to create an array of characters. Se usa el método IndexOf para encontrar el índice de inicio de la palabra "fox".It uses the IndexOf method to find the starting index of the word "fox." Los siguientes tres caracteres se reemplazan por otra palabra.The next three characters are replaced with a different word. Por último, se construye una cadena nueva a partir de la matriz de carácter actualizada.Finally, a new string is constructed from the updated character array.

string phrase = "The quick brown fox jumps over the fence";
Console.WriteLine(phrase);

char[] phraseAsChars = phrase.ToCharArray();
int animalIndex = phrase.IndexOf("fox");
if (animalIndex != -1)
{
    phraseAsChars[animalIndex++] = 'c';
    phraseAsChars[animalIndex++] = 'a';
    phraseAsChars[animalIndex] = 't';
}

string updatedPhrase = new string(phraseAsChars);
Console.WriteLine(updatedPhrase);

Modificaciones no seguras a una cadenaUnsafe modifications to string

Con el código unsafe puede modificar una cadena "en contexto" después de haberla creado.Using unsafe code, you can modify a string "in place" after it has been created. Con este código se anulan muchas de las características de .NET diseñadas para minimizar ciertos tipos de errores en el código.Unsafe code bypasses many of the features of .NET designed to minimize certain types of bugs in code. Es necesario su uso para modificar una cadena en contexto porque la clase de cadena se diseña como un tipo inmutable.You need to use unsafe code to modify a string in place because the string class is designed as an immutable type. Una vez se haya creado, el valor no cambia.Once it has been created, its value does not change. El código no seguro evita esta propiedad mediante el acceso y la modificación de la memoria que usa una string sin usar los métodos string normales.Unsafe code circumvents this property by accessing and modifying the memory used by a string without using normal string methods. En el ejemplo siguiente se indican estas extrañas situaciones en las que quiere modificar una cadena en contexto con código no seguro.The following example is provided for those rare situations where you want to modify a string in-place using unsafe code. En este ejemplo se muestra cómo usar la palabra clave fixed.The example shows how to use the fixed keyword. Con la palabra clave fixed se evita que el recolector de elementos no utilizados (GC) mueva los objetos de cadenas en memoria mientras que el código accede a la memoria mediante el puntero no seguro.The fixed keyword prevents the garbage collector (GC) from moving the string object in memory while code accesses the memory using the unsafe pointer. También muestra un posible efecto secundario de operaciones no seguras en cadenas que se obtienen de la manera en que el compilador de C# almacena cadenas (internos) internamente.It also demonstrates one possible side effect of unsafe operations on strings that results from the way that the C# compiler stores (interns) strings internally. En general, no debe usar esta técnica a no ser que sea absolutamente necesario.In general, you shouldn't use this technique unless it is absolutely necessary. Puede obtener más información en los artículos sobre unsafe y fixed.You can learn more in the articles on unsafe and fixed. En la referencia a la API para Intern se incluye información sobre el internamiento de cadenas.The API reference for Intern includes information on string interning.

unsafe
{
    // Compiler will store (intern) 
    // these strings in same location.
    string helloOne = "Hello";
    string helloTwo = "Hello";

    // Change one string using unsafe code.
    fixed (char* p = helloOne)
    {
        p[0] = 'C';
    }

    //  Both strings have changed.
    Console.WriteLine(helloOne);
    Console.WriteLine(helloTwo);
}

Eche un vistazo al código de nuestro repositorio de GitHub y pruebe estos ejemplos.You can try these samples by looking at the code in our GitHub repository. O bien, puede descargar los ejemplos como un archivo ZIP.Or you can download the samples as a zip file.

Vea tambiénSee also