Ändra stränginnehåll i C#

Tip

Den här artikeln är en del av avsnittet Grunderna för utvecklare som redan känner till minst ett programmeringsspråk och lär sig C#. Om du inte har använt programmering tidigare börjar du med självstudierna Komma igång först.

Kommer du från ett annat språk? Precis som Java och JavaScript är C#-strängar oföränderliga: metoder som Replace och Trim returnerar en ny sträng i stället för att ändra originalet. Mönstren här motsvarar String metoderna i de språken.

En C# string är oföränderlig, vilket innebär att dess innehåll aldrig ändras när du har skapat det. Varje metod som verkar ändra en sträng returnerar faktiskt en ny string med ändringarna, vilket lämnar originalet intakt. Exemplen i den här artikeln lagrar varje resultat i en ny variabel så att du kan se både källan och det ändrade värdet.

Välj den teknik som matchar ditt scenario: ersätt känd text, trimma blanksteg, ta bort ett teckenintervall, ersätt text som matchar ett mönster eller redigera enskilda tecken.

Ersätt känd text

Metoden String.Replace ersätter varje förekomst av en sträng med en annan och returnerar resultatet som en ny sträng:

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.

Den ursprungliga strängen är oförändrad, vilket visar oföränderlighet: Replace skapar en ny sträng med ersättningen.

Replace har också en överlagring som växlar enskilda tecken. I följande exempel ersätts varje blanksteg med ett understreck:

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.

Båda överlagringarna ersätter varje matchning i strängen, inte bara den första. Oavsett om du skickar ett enskilt tecken eller en sträng ersätter Replace alla förekomster i ett anrop.

Ta bort tomrum

Använd String.Trim, String.TrimStartoch String.TrimEnd för att ta bort inledande eller avslutande blanksteg. Varje metod returnerar en ny sträng:

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

Ta bort ett teckenintervall

Metoden String.Remove tar bort ett antal tecken som börjar vid ett index. Kombinera den med String.IndexOf för att hitta texten som du vill ta bort:

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.

Ersätt text som matchar ett mönster

När du behöver ersätta text som följer ett mönster i stället för en exakt sträng använder du reguljära uttryck. Metoden Regex.Replace tar emot en funktion som beräknar varje ersättningsvärde, så att du kan bevara detaljer, till exempel den ursprungliga användningen av versaler och gemener. Mönstret the\s matchar "the" som följs av ett blanktecken, vilket förhindrar att det matchar "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.

För mönsterbaserad sökning i stället för ersättning, se Söksträngar i C#. För syntaxen för reguljära uttryck, se Snabbreferens för reguljärt uttrycksspråk.

Ändra enskilda tecken

Om du vill ändra tecken efter position kopierar du strängen till ett Span<T> tecken, ändrar intervallet och skapar sedan en ny sträng från den. I följande exempel hittar du ordet "fox" och ersätter det med "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.

För scenarier med höga prestanda som undviker mellanliggande allokeringar tillhandahåller körningen API:er på lägre nivå, till exempel String.Create. Dessa tekniker är avancerade; för daglig kod är metoderna i den här artikeln rätt val.

Se även