Udostępnij za pośrednictwem


Jak: modyfikowanie zawartości ciągu (Podręcznik programowania C#)

Ponieważ ciągi są niezmienne, nie jest możliwe (bez użycia niebezpieczny kod) do modyfikowania wartości obiektu string po jego utworzeniu.Jednakże istnieje wiele sposobów modyfikowania wartości ciągu i zapisanie wyniku w nowym obiekcie string.System.String Klasy zawiera metody, które operują na dane wejściowe string i zwraca nowy obiekt string.W wielu przypadkach nowego obiektu można przypisać do zmiennej, to oryginalny ciąg znaków.System.Text.RegularExpressions.Regex Klasa zapewnia dodatkowe metody, które działają w podobny sposób.System.Text.StringBuilder Zawiera klasy bufor znaków, którą można modyfikować "w miejscu." Należy wywołać StringBuilder.ToString metodę, aby utworzyć nowy obiekt ciąg, który zawiera bieżącą zawartość buforu.

Przykład

Poniższy przykład ilustruje różne sposoby zamienić lub usunąć podciągów w określony ciąg.

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

Aby uzyskać dostęp do poszczególnych znaków w ciągu przy użyciu notacji tablicy, można użyć StringBuilder obiekt, który overloads [] operatora, aby zapewnić dostęp do buforu wewnętrznego znaków.Można także przekonwertować ciągu na tablicę znaków, za pomocą ToCharArray metody.W poniższym przykładzie użyto ToCharArray , aby utworzyć macierz.Niektóre elementy tej tablicy są następnie modyfikowane.Konstruktor ciągu, że trwa tablicy znaków jako parametr wejściowy jest następnie wywoływana Aby utworzyć nowy ciąg znaków.

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 
*/

Poniższy przykład jest przewidziane w tych sytuacjach bardzo rzadko, w których chcesz może zmodyfikować ciąg w miejscu za pomocą niebezpieczny kod w sposób podobny do tablice char c stylu.W przykładzie przedstawiono sposób do dostępu pojedyncze znaki "w miejsce" przy użyciu stałych słowa kluczowego.Ilustruje też jeden możliwe efektem ubocznym niebezpiecznymi operacjami na ciągi znaków związana ze sposobem, kompilator C# wewnętrznie przechowuje ciągi (stażystów).Ogólnie rzecz biorąc nie należy używać tej techniki, o ile jest to absolutnie konieczne.

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

}

Zobacz też

Koncepcje

Podręcznik programowania C#

Inne zasoby

Ciągi znaków (Podręcznik programowania C#)