Изменение содержимого строки в C#

Tip

Эта статья является частью раздела "Основы" для разработчиков , которые уже знают хотя бы один язык программирования и учат C#. Если вы не знакомы с программированием, сначала начните с учебных пособий по началу работы.

Вы пришли из другого языка? Как и Java и JavaScript, строки C# неизменяемы: такие методы, как Replace и Trim возврат новой строки вместо изменения исходного кода. Шаблоны здесь аналогичны String методам в этих языках.

C# string является неизменяемым, что означает, что его содержимое никогда не изменяется после его создания. Каждый метод, который, как представляется, изменяет строку, фактически возвращает новое string с изменениями, оставляя исходный нетронутым. Примеры, приведенные в этой статье, сохраняют каждый результат в новой переменной, чтобы вы могли видеть как источник, так и измененное значение.

Выберите способ, соответствующий вашему сценарию: замените известный текст, обрезать пробелы, удалите диапазон символов, замените текст, соответствующий шаблону, или измените отдельные символы.

Замена известного текста

Метод String.Replace заменяет каждое вхождение одной строки другой и возвращает результат в виде новой строки:

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

// Replace returns a new string; the original is unchanged.
string updated = source.Replace("mountains", "peaks");

Console.WriteLine(source);
// => The mountains are behind the clouds today.
Console.WriteLine(updated);
// => The peaks are behind the clouds today.

Исходная строка не изменяется, которая демонстрирует неизменяемость: Replace создает новую строку с подстановкой.

Replace также имеет перегрузку, которая переключает одиночные символы. Следующий пример заменяет каждое пространство символом подчеркивания:

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

// Replace every occurrence of one character with another.
string updated = source.Replace(' ', '_');

Console.WriteLine(updated);
// => The_mountains_are_behind_the_clouds_today.

Обе перегрузки заменяют каждое совпадение в строке, а не только первое. Независимо от того, передаёте ли вы один символ или строку, Replace заменяет все вхождения за один вызов.

Обрезать пробелы

Используйте String.Trim, String.TrimStart и String.TrimEnd, чтобы удалить начальные или конечные пробелы. Каждый метод возвращает новую строку:

string source = "    I'm wider than I need to be.      ";

// Each method returns a new string with whitespace removed.
Console.WriteLine($"<{source.Trim()}>");
// => <I'm wider than I need to be.>
Console.WriteLine($"<{source.TrimStart()}>");
// => <I'm wider than I need to be.      >
Console.WriteLine($"<{source.TrimEnd()}>");
// => <    I'm wider than I need to be.>

Удалить фрагмент символов

Метод String.Remove удаляет ряд символов, начиная с индекса. Объедините его с String.IndexOf, чтобы найти текст для удаления:

string source = "Many mountains are behind many clouds today.";
string toRemove = "many ";

// Find the text, then remove that span by index and length.
int index = source.IndexOf(toRemove);
string result = index >= 0
    ? source.Remove(index, toRemove.Length)
    : source;

Console.WriteLine(result);
// => Many mountains are behind clouds today.

Замена текста, соответствующего шаблону

Если необходимо заменить текст, который следует шаблону, а не точной строке, используйте регулярные выражения. Метод Regex.Replace принимает функцию, вычисляющую каждую замену, чтобы можно было сохранить такие сведения, как исходная заглавная буква. Шаблон the\s совпадает с "the", за которым следует пробельный символ, что не позволяет ему совпадать с "there":

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

// Replace "the" or "The" followed by whitespace, preserving the original case.
// The \s in the pattern keeps "there" from matching.
string result = Regex.Replace(
    source,
    """the\s""",
    match => char.IsUpper(match.Value[0]) ? "Many " : "many ",
    RegexOptions.IgnoreCase);

Console.WriteLine(result);
// => Many mountains are still there behind many clouds today.

Сведения о поиске по шаблону, а не о замене, см. в разделе Поиск строк в C#. Сведения о синтаксисе регулярного выражения см. в кратком справочнике по языку регулярных выражений.

Изменение отдельных символов

Чтобы изменить символы по позиции, скопируйте строку в Span<T> символы, измените диапазон и создайте новую строку из нее. Следующий пример находит слово "лиса" и заменяет его на "кот":

string phrase = "The quick brown fox jumps over the fence.";

// A string is immutable, so copy it into a Span<char> to edit in place.
Span<char> characters = stackalloc char[phrase.Length];
phrase.CopyTo(characters);
int index = phrase.IndexOf("fox");
if (index != -1)
{
    characters[index] = 'c';
    characters[index + 1] = 'a';
    characters[index + 2] = 't';
}

// Build a new string from the modified characters.
string updated = new string(characters);
Console.WriteLine(updated);
// => The quick brown cat jumps over the fence.

Для высокопроизводительных сценариев, в которых удаётся избежать промежуточных выделений памяти, среда выполнения предоставляет низкоуровневые API, такие как String.Create. Эти методы являются расширенными; для повседневного кода методы в этой статье являются правильным выбором.

См. также