Бөлісу құралы:


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

В этой статье показано несколько методов создания string, изменив существующий string. Все методы, демонстрируемые, возвращают результат изменений в виде нового string объекта. Чтобы продемонстрировать, что исходные и измененные строки являются отдельными экземплярами, примеры сохраняют результат в новой переменной. Вы можете проверить исходный string и новый, измененные string при выполнении каждого примера.

В этой статье описано несколько методов. Можно заменить существующий текст. Вы можете искать шаблоны и заменить соответствующий текст другим текстом. Строку можно рассматривать как последовательность символов. Вы также можете использовать удобные методы, которые удаляют пробелы. Выберите методы, которые наиболее тесно соответствуют вашему сценарию.

Заменить текст

Следующий код создает новую строку, заменив существующий текст заменой.

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

// Replace one substring with another with String.Replace.
// Only exact matches are supported.
var replacement = source.Replace("mountains", "peaks");
Console.WriteLine($"The source string is <{source}>");
Console.WriteLine($"The updated string is <{replacement}>");

Приведенный выше код демонстрирует это неизменяемое свойство строк. В приведенном выше примере видно, что source, исходная строка не изменяется. Метод String.Replace создает новый string , содержащий изменения.

Метод Replace может заменить строки или одинарные символы. В обоих случаях каждое вхождение искомого текста заменяется. В следующем примере заменяются все символы ' на "_".

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

// Replace all occurrences of one char with another.
var replacement = source.Replace(' ', '_');
Console.WriteLine(source);
Console.WriteLine(replacement);

Исходная строка не изменяется, а новая строка возвращается с заменой.

Удалить лишние пробелы

Вы можете использовать методы String.Trim, String.TrimStart и String.TrimEnd для удаления любого начального или конечного пробела. В следующем коде показан пример каждого из них. Исходная строка не изменяется; эти методы возвращают новую строку с измененным содержимым.

// Remove trailing and leading white space.
string source = "    I'm wider than I need to be.      ";
// Store the results in a new string variable.
var trimmedResult = source.Trim();
var trimLeading = source.TrimStart();
var trimTrailing = source.TrimEnd();
Console.WriteLine($"<{source}>");
Console.WriteLine($"<{trimmedResult}>");
Console.WriteLine($"<{trimLeading}>");
Console.WriteLine($"<{trimTrailing}>");

Удаление текста

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

string source = "Many mountains are behind many clouds today.";
// Remove a substring from the middle of the string.
string toRemove = "many ";
string result = string.Empty;
int i = source.IndexOf(toRemove);
if (i >= 0)
{
    result= source.Remove(i, toRemove.Length);
}
Console.WriteLine(source);
Console.WriteLine(result);

Замена соответствующих шаблонов

Регулярные выражения можно использовать для замены шаблонов сопоставления текста новым текстом, возможно, определенным шаблоном. В следующем примере используется класс System.Text.RegularExpressions.Regex для поиска шаблона в исходной строке и замены его с правильной капитализацией. Метод Regex.Replace(String, String, MatchEvaluator, RegexOptions) принимает функцию, которая предоставляет логику замены в качестве одного из его аргументов. В этом примере эта функция является LocalReplaceMatchCase, объявленной внутри примера метода. LocalReplaceMatchCase использует класс System.Text.StringBuilder, чтобы построить строку замены с правильным использованием заглавных букв.

Регулярные выражения наиболее полезны для поиска и замены текста, который следует шаблону, а не известного текста. Дополнительные сведения см. в разделе "Поиск строк". Шаблон поиска "the\s" ищет слово "the", за которым следует символ пробела. Эта часть шаблона должна гарантировать, что он не будет соответствовать "there" в исходной строке. Дополнительные сведения о элементах языка регулярных выражений см. в кратком справочнике по языку регулярных выражений.

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

// Use Regex.Replace for more flexibility.
// Replace "the" or "The" with "many" or "Many".
// using System.Text.RegularExpressions
string replaceWith = "many ";
source = System.Text.RegularExpressions.Regex.Replace(source, """the\s""", LocalReplaceMatchCase,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Console.WriteLine(source);

string LocalReplaceMatchCase(System.Text.RegularExpressions.Match matchExpression)
{
    // Test whether the match is capitalized
    if (Char.IsUpper(matchExpression.Value[0]))
    {
        // Capitalize the replacement string
        System.Text.StringBuilder replacementBuilder = new System.Text.StringBuilder(replaceWith);
        replacementBuilder[0] = Char.ToUpper(replacementBuilder[0]);
        return replacementBuilder.ToString();
    }
    else
    {
        return replaceWith;
    }
}

Метод StringBuilder.ToString возвращает неизменяемую строку с содержимым объекта StringBuilder .

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

Вы можете создать массив символов из строки, изменить содержимое массива, а затем создать новую строку из измененного содержимого массива.

В следующем примере показано, как заменить набор символов в строке. Во-первых, он использует String.ToCharArray() метод для создания массива символов. Он использует IndexOf метод для поиска начального индекса слова "fox". Следующие три символа заменяются другим словом. Наконец, новая строка создается из обновленного массива символов.

string phrase = "The quick brown fox jumps over the fence";
Console.WriteLine(phrase);

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

string updatedPhrase = new string(phraseAsChars);
Console.WriteLine(updatedPhrase);

Программное создание строкового содержимого

Так как строки неизменяемы, предыдущие примеры создают временные строки или массивы символов. В сценариях высокой производительности желательно избежать выделения кучи. .NET предоставляет String.Create метод, позволяющий программно заполнять символьное содержимое строки с помощью обратного вызова, избегая выделения промежуточных временных строк.

// constructing a string from a char array, prefix it with some additional characters
char[] chars = [ 'a', 'b', 'c', 'd', '\0' ];
int length = chars.Length + 2;
string result = string.Create(length, chars, (Span<char> strContent, char[] charArray) =>
{
        strContent[0] = '0';
        strContent[1] = '1';
        for (int i = 0; i < charArray.Length; i++)
        {
            strContent[i + 2] = charArray[i];
        }
});

Console.WriteLine(result);

Можно изменить строку в фиксированном блоке с небезопасным кодом, но настоятельно не рекомендуется изменять содержимое строки после создания строки. Это приводит к непредсказуемым ошибкам. Например, если кто-то интернирует строку, которая имеет то же содержимое, что и ваша, они получают копию и не ожидают, что вы изменяете свою строку.

См. также