Úprava obsahu řetězce v jazyce C#

Tip

Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Pokud s programováním teprve začínáte, začněte nejprve kurzy Začínáme .

Pochází z jiného jazyka? Stejně jako Java a JavaScript jsou řetězce jazyka C# neměnné: metody, jako je například Replace a Trim vrací nový řetězec místo změny původního řetězce. Zdejší vzory odpovídají metodám String v těchto jazycích.

Jazyk C# string je neměnný, což znamená, že jeho obsah se po vytvoření nikdy nezmění. Každá metoda, která zdánlivě upravuje řetězec, ve skutečnosti vrátí nový string se změnami a původní ponechá beze změny. Příklady v tomto článku ukládají každý výsledek do nové proměnné, abyste viděli zdroj i upravenou hodnotu.

Zvolte techniku, která odpovídá vašemu scénáři: nahraďte známý text, ořízněte prázdné znaky, odeberte rozsah znaků, nahraďte text, který odpovídá vzoru, nebo upravte jednotlivé znaky.

Nahrazení známého textu

Metoda String.Replace nahradí každý výskyt jednoho řetězce jiným a vrátí výsledek jako nový řetězec:

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.

Původní řetězec se nezmění, což ukazuje neměnnost: Replace vytvoří nový řetězec s nahrazením.

Replace má také přetíženou variantu, která slouží k záměně jednotlivých znaků. Následující příklad nahradí každé mezery podtržítkem:

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.

Obě přetížení nahradí v řetězci každou shodu, nejen tu první. Bez ohledu na to, jestli předáte jeden znak nebo řetězec, Replace nahradí všechny výskyty v jednom volání.

Oříznout prázdné znaky

Pomocí String.Trim, String.TrimStart a String.TrimEnd odeberete prázdné znaky na začátku nebo na konci. Každá metoda vrátí nový řetězec:

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

Odstranit sekvenci znaků

Metoda String.Remove odstraní řadu znaků začínajících indexem. String.IndexOf Zkombinujte ho a vyhledejte text, který chcete odebrat:

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.

Nahrazení textu, který odpovídá vzoru

Pokud potřebujete nahradit text, který se řídí vzorem místo přesného řetězce, použijte regulární výrazy. Metoda Regex.Replace přijímá funkci, která vypočítá každou náhradu, takže můžete zachovat podrobnosti, jako je původní velká písmena. Vzor the\s odpovídá řetězci „the“, po němž následuje znak mezery, což zabrání tomu, aby odpovídal řetězci „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.

Hledání založené na vzorech místo nahrazení najdete v tématu Řetězce hledání v jazyce C#. Syntaxi regulárního výrazu najdete v stručné referenční dokumentaci jazyka regulárních výrazů.

Úprava jednotlivých znaků

Pokud chcete změnit znaky podle pozice, zkopírujte řetězec do znaků Span<T> , upravte rozsah a pak z něj vytvořte nový řetězec. Následující příklad najde slovo "fox" a nahradí ho slovem "cat":

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.

V případě vysoce výkonných scénářů, které se vyhýbají průběžným přidělením, poskytuje modul runtime rozhraní API nižší úrovně, například String.Create. Tyto techniky jsou pokročilé; pro každodenní kód jsou metody v tomto článku správnou volbou.

Viz také