Sdílet prostřednictvím


Postupy: Změna obsahu řetězce (Průvodce programováním v C#)

Protože jsou řetězce nezměnitelné, není možné (bez nebezpečného kódu) změnit hodnotu řetězce objektu po jeho vytvoření.Existuje však mnoho způsobů, jak změnit hodnotu řetězce a výsledek uložit do nového objektu řetězec.String Třída poskytuje metody, které fungují na vstup řetězce a vrátí nový objekt řetězce.V mnoha případech můžete přiřadit nový objekt proměnnou, která se koná původní řetězec.Regex Třída poskytuje další metody, které fungují podobným způsobem.StringBuilder Třída poskytuje vyrovnávací paměti znak, který můžete upravit "na místě." Volání StringBuilder.ToString k vytvoření nového objektu řetězec obsahující aktuální obsah vyrovnávací paměti.

Příklad

Následující příklad ukazuje různé způsoby nahradit nebo odebrat podřetězce v zadaném řetězci.

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

Jednotlivé znaky v řetězci přístup pomocí zápisu pole, můžete použít StringBuilder objektu přetížení [] operátor přístupu k jeho znak vnitřní vyrovnávací paměti.Můžete také převést řetězec na pole znaků pomocí ToCharArray metoda.Následující příklad používá ToCharArray vytvořte pole.Některé prvky tohoto pole jsou potom změněny.Řetězec konstruktoru, že bere pole znaků jako vstupní parametr se pak nazývá vytvořit nový řetězec.

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

V následujícím příkladu je k dispozici pro tyto velmi vzácný situace, ve kterých chcete pomocí nebezpečný kód pole char c styl podobným způsobem změnit řetězec na místě.Příklad ukazuje, jak pomocí klíčového slova dlouhodobý přístup jednotlivých znaků "na místě".Rovněž ukazuje jeden možný boční efekt nebezpečných operací na řetězce je výsledkem způsobu kompilátor C# interně uchovává řetězce (interns).Obecně byste neměli používat tato technika není nezbytně nutné.

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

}

Viz také

Koncepty

Průvodce programováním v C#

Další zdroje

Řetězce (Průvodce programováním v C#)