Modificar o conteúdo da cadeia em C#

Sugestão

Este artigo faz parte da secção Fundamentos para programadores que já conhecem pelo menos uma linguagem de programação e estão a aprender C#. Se és novo na programação, começa primeiro pelos tutoriais para começar .

Vem de outra língua? Tal como Java e JavaScript, as strings C# são imutáveis: métodos como Replace e Trim retornam uma nova string em vez de alterar a original. Os padrões aqui são semelhantes aos métodos String nessas línguas.

Um C# string é imutável, o que significa que o seu conteúdo nunca muda depois de o criar. Cada método que parece modificar uma cadeia retorna um novo string com as alterações, mantendo o original intacto. Os exemplos deste artigo armazenam cada resultado numa nova variável para que possas ver tanto a fonte como o valor modificado.

Escolha a técnica que corresponda ao seu cenário: substituir texto conhecido, recortar espaços em branco, remover um intervalo de caracteres, substituir texto que corresponda a um padrão ou editar caracteres individuais.

Substituir texto conhecido

O String.Replace método substitui cada ocorrência de uma cadeia por outra e devolve o resultado como uma nova cadeia:

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.

A cadeia original mantém-se inalterada, o que demonstra imutabilidade: Replace cria uma nova sequência com a substituição.

Replace Também tem uma sobrecarga que troca de personagens individuais. O exemplo seguinte substitui cada espaço por um sublinhado:

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.

Ambas as sobrecargas substituem todas as correspondências na cadeia, não apenas a primeira. Quer passes um único carácter ou uma cadeia, Replace substitui todas as ocorrências numa só chamada.

Cortar espaço em branco

Utilize String.Trim, String.TrimStart e String.TrimEnd para remover espaços em branco no início ou no fim. Cada método devolve uma nova cadeia:

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.>

Remover um intervalo de caracteres

O String.Remove método elimina vários caracteres começando num índice. Combine-o com String.IndexOf para localizar o texto a remover:

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.

Substituir o texto que corresponde a um padrão

Quando precisar de substituir texto que segue um padrão em vez de uma cadeia exata, use expressões regulares. O Regex.Replace método aceita uma função que calcula cada substituição, para que possa preservar detalhes como a capitalização original. O padrão the\s corresponde a "the" seguido de um carácter de espaço em branco, o que impede que coincida com "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.

Para pesquisa por padrões em vez de substituição, consulte cadeias de pesquisa em C#. Para a sintaxe de expressões regulares, veja Referência rápida de linguagem de expressões regulares.

Modificar personagens individuais

Para alterar caracteres por posição, copie a cadeia para um Span<T> de caracteres, modifique o intervalo e depois constrói uma nova cadeia a partir dela. O exemplo seguinte encontra a palavra "raposa" e substitui-a por "gato":

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.

Para cenários de alto desempenho que evitam alocações intermédias, o tempo de execução fornece APIs de nível inferior como String.Create. Essas técnicas são avançadas; Para código do dia a dia, os métodos deste artigo são a escolha certa.

Consulte também