Cómo: Modificar el contenido de cadenas (Guía de programación de C#)

Actualización: Julio de 2008

Dado que las cadenas son inmutables, no es posible modificar el valor de un objeto de cadena una vez creado sin utilizar código no seguro. Sin embargo, existen muchas maneras de modificar el valor de una cadena y almacenar el resultado en un nuevo objeto de cadena. La clase System.String proporciona métodos que actúan en una cadena de entrada y devuelven un nuevo objeto de cadena. En muchos casos, puede asignar el nuevo objeto a la variable que contenía la cadena original. La clase System.Text.RegularExpressions.Regex proporciona métodos adicionales que funcionan de manera similar. La clase System.Text.StringBuilder proporciona un búfer de caracteres que puede modificar "en contexto". Llame al método StringBuilder.ToString para crear un nuevo objeto de cadena que incluya el contenido actual del búfer.

Ejemplo

En el ejemplo siguiente se muestran varias formas de reemplazar o quitar subcadenas en una cadena especificada.

class ReplaceSubstrings
{
    string searchFor;
    string replaceWith;

    static void Main(string[] args)
    {

        ReplaceSubstrings app = new ReplaceSubstrings();
        string s = "The mountains are behind the clouds today.";

        // Replace one substring with another with String.Replace.
        // Only exact matches are supported.
        s = s.Replace("mountains", "peaks");
        Console.WriteLine(s);
        // Output: The peaks are behind the clouds today.

        // Use Regex.Replace for more flexibility. 
        // Replace "the" or "The" with "many" or "Many".
        // using System.Text.RegularExpressions
        app.searchFor = "the"; // A very simple regular expression.
        app.replaceWith = "many";
        s = Regex.Replace(s, app.searchFor, app.ReplaceMatchCase, RegexOptions.IgnoreCase);
        Console.WriteLine(s);
        // Output: Many peaks are behind many clouds today.

        // Replace all occurrences of one char with another.
        s = s.Replace(' ', '_');
        Console.WriteLine(s);
        // Output: Many_peaks_are_behind_many_clouds_today.

        // Remove a substring from the middle of the string.
        string temp = "many_";
        int i = s.IndexOf(temp);
        if (i >= 0)
        {
            s = s.Remove(i, temp.Length);
        }
        Console.WriteLine(s);
        // Output: Many_peaks_are_behind_clouds_today.

        // Remove trailing and leading whitespace.
        // See also the TrimStart and TrimEnd methods.
        string s2 = "    I'm wider than I need to be.      ";
        // Store the results in a new string variable.
        temp = s2.Trim();
        Console.WriteLine(temp);
        // Output: I'm wider than I need to be.

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    // Custom match method called by Regex.Replace
    // using System.Text.RegularExpressions
    string ReplaceMatchCase(Match m)
    {
        // Test whether the match is capitalized
        if (Char.IsUpper(m.Value[0]) == true)
        {
            // Capitalize the replacement string
            // using System.Text;
            StringBuilder sb = new StringBuilder(replaceWith);
            sb[0] = (Char.ToUpper(sb[0]));
            return sb.ToString();
        }
        else
        {
            return replaceWith;
        }
    }
}

Para obtener acceso a los caracteres individuales de una cadena mediante la notación de matrices, puede utilizar el objeto StringBuilder, que sobrecarga el operador [] para proporcionar acceso a su búfer de caracteres interno. También puede convertir la cadena en una matriz de caracteres mediante el método ToCharArray. En el ejemplo siguiente se utiliza ToCharArray para crear la matriz. A continuación, se modifican algunos elementos de esa matriz. Después, se llama a un constructor de cadena que toma una matriz de caracteres como parámetro de entrada para crear una nueva cadena.

class ModifyStrings
{
    static void Main()
    {
        string str = "The quick brown fox jumped over the fence";
        System.Console.WriteLine(str);

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

        string str2 = new string(chars);
        System.Console.WriteLine(str2);

        // Keep the console window open in debug mode
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
  The quick brown fox jumped over the fence
  The quick brown cat jumped over the fence 
*/

El ejemplo siguiente se proporciona para aquellas situaciones poco habituales en las que puede que desee modificar una cadena en contexto mediante código no seguro de forma similar a las matrices de caracteres de estilo de C. En el ejemplo se muestra cómo obtener acceso a los caracteres individuales "en contexto" mediante la palabra clave fixed. También se muestra un posible efecto secundario de realizar operaciones no seguras en las cadenas que se produce por la forma en que el compilador de C# almacena (confina) las cadenas internamente. En general, no debería utilizar esta técnica a menos que sea absolutamente necesario.

class UnsafeString
{
    unsafe static void Main(string[] args)
    {
        // Compiler will store (intern) 
        // these strings in same location.
        string s1 = "Hello";
        string s2 = "Hello";

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

        //  Both strings have changed.
        Console.WriteLine(s1);
        Console.WriteLine(s2);

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

}

Vea también

Conceptos

Guía de programación de C#

Referencia

Cadenas (Guía de programación de C#)

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Numerosos cambios y ejemplos de código adicionales para mejorar la exactitud y la integridad.

Corrección de errores de contenido.