Поделиться через


Практическое руководство. Изменение содержимого строки (Руководство по программированию в C#)

Обновлен: Июль 2008

Поскольку строки являются неизменяемыми, невозможно (без использования небезопасного кода) изменить значение объекта строки после его создания. Однако существует много способов изменения значения строки и сохранения результата в новом объекте строки. Класс System.String предоставляет методы, которые обрабатывают входную строку и возвращают новый объект строки. В большинстве случаев можно присвоить новый объект к переменной, содержавшей исходную строку. Класс System.Text.RegularExpressions.Regex предоставляет дополнительные методы, работающие аналогичным образом. КлассSystem.Text.StringBuilder предоставляет буфер символов, который можно изменить "на месте". Метод StringBuilder.ToString вызывается для создания нового объекта строки, который содержит текущее содержимое буфера.

Пример

В следующем примере показаны различные способы замены или удаления подстрок в указанной строке.

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

Для доступа к отдельным символам в строке с помощью нотаций массива можно использовать объект StringBuilder, перегружающий оператор [] для предоставления доступа к его внутреннему буферу символов. Также можно преобразовать строку в массив символов с помощью метода ToCharArray. В следующем примере используется ToCharArray для создания массива. Затем некоторые элементы массива изменяются. Конструктор строк, принимающий массив символов в качестве входного параметра, затем вызывается для создания новой строки.

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

Следующий пример предоставлен для тех редких случаев, в которых может понадобиться изменить строку на месте с помощью небезопасного кода аналогично массивам символов стиля C. В примере показан доступ к отдельным символам "на месте" с помощью фиксированного ключевого слова. Также в нем показано одно возможное побочное действие небезопасных операций со строками, которое является результатом внутреннего хранения (интернирования) компилятором C# строк. В общем, использовать этот метод следует только в тех случаях, когда это совершенно необходимо.

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

}

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Строки (руководство по программированию на C#)

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Масштабные изменения и дополнительные примеры кода для улучшения точности и полноты.

Исправление ошибки содержимого.