Dela via


Så här ändrar du stränginnehåll i C#

Den här artikeln visar flera tekniker för att skapa en string genom att ändra en befintlig string. Alla tekniker som demonstreras returnerar resultatet av ändringarna som ett nytt string objekt. För att visa att de ursprungliga och ändrade strängarna är distinkta instanser lagrar exemplen resultatet i en ny variabel. Du kan undersöka originalet string och det nya, ändrade string när du kör varje exempel.

Kommentar

C#-exemplen i den här artikeln körs i Try.NET infogad kodlöpare och lekplats. Välj knappen Kör för att köra ett exempel i ett interaktivt fönster. När du har kört koden kan du ändra den och köra den ändrade koden genom att välja Kör igen. Den ändrade koden körs antingen i det interaktiva fönstret eller, om kompilering misslyckas, visar det interaktiva fönstret alla felmeddelanden för C#-kompilatorn.

Det finns flera tekniker som demonstreras i den här artikeln. Du kan ersätta befintlig text. Du kan söka efter mönster och ersätta matchande text med annan text. Du kan behandla en sträng som en sekvens med tecken. Du kan också använda bekvämlighetsmetoder som tar bort tomt utrymme. Välj de tekniker som bäst matchar ditt scenario.

Ersätt text

Följande kod skapar en ny sträng genom att ersätta befintlig text med en ersättning.

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

Föregående kod visar den här oföränderliga egenskapen för strängar. Du kan se i föregående exempel att den ursprungliga strängen, source, inte har ändrats. Metoden String.Replace skapar en ny string som innehåller ändringarna.

Metoden Replace kan ersätta antingen strängar eller enkla tecken. I båda fallen ersätts varje förekomst av den begärda texten. I följande exempel ersätts alla tecken med _:

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

Källsträngen är oförändrad och en ny sträng returneras med ersättningen.

Trimma tomt utrymme

Du kan använda String.Trimmetoderna , String.TrimStartoch String.TrimEnd för att ta bort alla inledande eller avslutande blanksteg. Följande kod visar ett exempel på var och en. Källsträngen ändras inte. dessa metoder returnerar en ny sträng med det ändrade innehållet.

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

Ta bort text

Du kan ta bort text från en sträng med hjälp av String.Remove metoden . Den här metoden tar bort ett antal tecken som börjar vid ett specifikt index. I följande exempel visas hur du använder String.IndexOf följt av Remove för att ta bort text från en sträng:

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

Ersätt matchande mönster

Du kan använda reguljära uttryck för att ersätta textmatchningsmönster med ny text, eventuellt definierad av ett mönster. I följande exempel används System.Text.RegularExpressions.Regex klassen för att hitta ett mönster i en källsträng och ersätta den med rätt versaler. Metoden Regex.Replace(String, String, MatchEvaluator, RegexOptions) använder en funktion som tillhandahåller logiken för ersättningen som ett av argumenten. I det här exemplet är den funktionen LocalReplaceMatchCase en lokal funktion som deklareras i exempelmetoden. LocalReplaceMatchCaseSystem.Text.StringBuilder använder klassen för att skapa ersättningssträngen med rätt versaler.

Reguljära uttryck är mest användbara för att söka efter och ersätta text som följer ett mönster i stället för känd text. Mer information finns i Så här söker du efter strängar. Sökmönstret "the\s" söker efter ordet "the" följt av ett blankstegstecken. Den delen av mönstret säkerställer att den inte matchar "där" i källsträngen. Mer information om språkelement för reguljära uttryck finns i Språk för reguljära uttryck – snabbreferens.

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

Metoden StringBuilder.ToString returnerar en oföränderlig sträng med innehållet i StringBuilder objektet.

Ändra enskilda tecken

Du kan skapa en teckenmatris från en sträng, ändra innehållet i matrisen och sedan skapa en ny sträng från matrisens ändrade innehåll.

I följande exempel visas hur du ersätter en uppsättning tecken i en sträng. Först använder den String.ToCharArray() metoden för att skapa en matris med tecken. Den använder IndexOf metoden för att hitta startindexet för ordet "fox". De följande tre tecknen ersätts med ett annat ord. Slutligen skapas en ny sträng från den uppdaterade teckenmatrisen.

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

Skapa stränginnehåll programmatiskt

Eftersom strängar är oföränderliga skapar alla tidigare exempel tillfälliga strängar eller teckenmatriser. I scenarier med höga prestanda kan det vara önskvärt att undvika dessa heap-allokeringar. .NET Core tillhandahåller en String.Create metod som gör att du programmatiskt kan fylla i teckeninnehållet i en sträng via ett återanrop samtidigt som du undviker mellanliggande temporära strängallokeringar.

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

Du kan ändra en sträng i ett fast block med osäker kod, men det rekommenderas starkt att ändra stränginnehållet när en sträng har skapats. Att göra det kommer att bryta saker på oförutsägbara sätt. Om någon till exempel internerar en sträng som har samma innehåll som din, får de din kopia och förväntar sig inte att du ändrar strängen.

Se även