Compartilhar via


Como modificar o conteúdo da cadeia de caracteres em C#

Este artigo demonstra várias técnicas para produzir um string modificando um existente string. Todas as técnicas demonstradas retornam o resultado das modificações como um novo string objeto. Para demonstrar que as cadeias de caracteres originais e modificadas são instâncias distintas, os exemplos armazenam o resultado em uma nova variável. Você pode examinar o original string e o novo, modificados string ao executar cada exemplo.

Há várias técnicas demonstradas neste artigo. Você pode substituir o texto existente. Você pode pesquisar padrões e substituir o texto correspondente por outro texto. Você pode tratar uma cadeia de caracteres como uma sequência de caracteres. Você também pode usar métodos de conveniência que removem espaço em branco. Escolha as técnicas que mais correspondem ao seu cenário.

Substituir texto

O código a seguir cria uma nova cadeia de caracteres substituindo o texto existente por um substituto.

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

O código anterior demonstra essa propriedade imutável de cadeias de caracteres. No exemplo anterior, sourcevocê pode ver que a cadeia de caracteres original não foi modificada. O String.Replace método cria um novo string contendo as modificações.

O Replace método pode substituir cadeias de caracteres ou caracteres únicos. Em ambos os casos, todas as ocorrências do texto procurado são substituídas. O exemplo a seguir substitui todos os ' ' caracteres por '_':

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

A cadeia de caracteres de origem permanece inalterada e uma nova cadeia de caracteres é retornada com a substituição.

Cortar espaço em branco

Você pode usar os métodos String.Trim, String.TrimStart e String.TrimEnd para remover qualquer espaço em branco no início ou no final. O código a seguir mostra um exemplo de cada um. A cadeia de caracteres de origem não é alterada; esses métodos retornam uma nova cadeia de caracteres com o conteúdo modificado.

// 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}>");

Remover texto

Você pode remover o texto de uma cadeia de caracteres usando o String.Remove método. Esse método remove o número especificado de caracteres começando em um índice específico. O exemplo a seguir mostra como usar String.IndexOf seguido Remove para remover texto de uma cadeia de caracteres:

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

Substituir padrões de correspondência

Você pode usar expressões regulares para substituir padrões de correspondência de texto por um novo texto, possivelmente definido por um padrão. O exemplo a seguir usa a System.Text.RegularExpressions.Regex classe para encontrar um padrão em uma cadeia de caracteres de origem e substituí-lo pela capitalização adequada. O Regex.Replace(String, String, MatchEvaluator, RegexOptions) método usa uma função que fornece a lógica da substituição como um de seus argumentos. Neste exemplo, essa função LocalReplaceMatchCase é uma função local declarada dentro do método de exemplo. LocalReplaceMatchCase usa a System.Text.StringBuilder classe para criar a cadeia de caracteres de substituição com a capitalização adequada.

Expressões regulares são mais úteis para pesquisar e substituir texto que segue um padrão, em vez de texto conhecido. Para obter mais informações, consulte Como pesquisar cadeias de caracteres. O padrão de pesquisa, "the\s", procura a palavra "the" seguida por um caractere de espaço em branco. Essa parte do padrão garante que ele não corresponda "lá" na cadeia de caracteres de origem. Para obter mais informações sobre elementos de linguagem de expressão regular, consulte Linguagem de Expressão Regular – Referência Rápida.

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

O StringBuilder.ToString método retorna uma cadeia de caracteres imutável com o conteúdo no StringBuilder objeto.

Modificando caracteres individuais

Você pode produzir uma matriz de caracteres de uma cadeia de caracteres, modificar o conteúdo da matriz e, em seguida, criar uma nova cadeia de caracteres com base no conteúdo modificado da matriz.

O exemplo a seguir mostra como substituir um conjunto de caracteres em uma cadeia de caracteres. Primeiro, ele usa o String.ToCharArray() método para criar uma matriz de caracteres. Ele usa o IndexOf método para localizar o índice inicial da palavra "fox". Os próximos três caracteres são substituídos por uma palavra diferente. Por fim, uma nova cadeia de caracteres é construída a partir da matriz de caracteres atualizada.

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

Montar conteúdo de string programaticamente

Como as cadeias de caracteres são imutáveis, os exemplos anteriores criam cadeias de caracteres temporárias ou matrizes de caracteres. Em cenários de alto desempenho, é desejável evitar essas alocações de heap. O .NET fornece um String.Create método que permite preencher programaticamente o conteúdo de caracteres de uma string por meio de um callback, evitando as alocações temporárias de strings intermediárias.

// 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);

Você pode modificar uma cadeia de caracteres em um bloco fixo com código não seguro, mas é altamente desencorajado modificar o conteúdo da cadeia de caracteres depois que uma cadeia de caracteres é criada. Isso causa bugs imprevisíveis. Por exemplo, se alguém interna uma cadeia de caracteres que tenha o mesmo conteúdo que a sua, essa pessoa receberá a sua cópia e não esperaria que você estivesse modificando a cadeia de caracteres deles.

Consulte também