Delen via


De inhoud van tekenreeksen wijzigen in C#

In dit artikel worden verschillende technieken gedemonstreerd om een string bestaande stringte produceren. Alle technieken die hebben aangetoond, retourneren het resultaat van de wijzigingen als een nieuw string object. Om te laten zien dat de oorspronkelijke en gewijzigde tekenreeksen afzonderlijke exemplaren zijn, worden in de voorbeelden het resultaat opgeslagen in een nieuwe variabele. U kunt het origineel string en de nieuwe bekijken, gewijzigd string wanneer u elk voorbeeld uitvoert.

Notitie

De C#-voorbeelden in dit artikel worden uitgevoerd in de Try.NET inline coderunner en playground. Selecteer de knop Uitvoeren om een voorbeeld uit te voeren in een interactief venster. Nadat u de code hebt uitgevoerd, kunt u deze wijzigen en de gewijzigde code uitvoeren door Opnieuw uitvoeren te selecteren. De gewijzigde code wordt uitgevoerd in het interactieve venster of, als de compilatie mislukt, worden alle C#-compilerfoutberichten weergegeven.

In dit artikel worden verschillende technieken gedemonstreerd. U kunt bestaande tekst vervangen. U kunt zoeken naar patronen en overeenkomende tekst vervangen door andere tekst. U kunt een tekenreeks behandelen als een reeks tekens. U kunt ook handige methoden gebruiken om witruimte te verwijderen. Kies de technieken die het meest overeenkomen met uw scenario.

Tekst vervangen

Met de volgende code wordt een nieuwe tekenreeks gemaakt door bestaande tekst te vervangen door een vervanging.

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

De voorgaande code demonstreert deze onveranderbare eigenschap van tekenreeksen. U kunt in het vorige voorbeeld zien dat de oorspronkelijke tekenreeks, sourceniet is gewijzigd. Met String.Replace de methode maakt u een nieuwe string met de wijzigingen.

De Replace methode kan tekenreeksen of enkele tekens vervangen. In beide gevallen wordt elk exemplaar van de gezochte tekst vervangen. In het volgende voorbeeld worden alle ' tekens ' vervangen door '_':

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

De brontekenreeks is ongewijzigd en er wordt een nieuwe tekenreeks geretourneerd met de vervanging.

Witruimte knippen

U kunt de String.Trim, String.TrimStarten String.TrimEnd methoden gebruiken om eventuele voorloop- of volgspaties te verwijderen. In de volgende code ziet u een voorbeeld van elk. De brontekenreeks verandert niet; deze methoden retourneren een nieuwe tekenreeks met de gewijzigde inhoud.

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

Tekst verwijderen

U kunt tekst uit een tekenreeks verwijderen met behulp van de String.Remove methode. Met deze methode verwijdert u een aantal tekens die beginnen bij een specifieke index. In het volgende voorbeeld ziet u hoe String.IndexOf u tekst uit een tekenreeks verwijdert, gevolgd door Remove :

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

Overeenkomende patronen vervangen

U kunt reguliere expressies gebruiken om tekstkoppelingspatronen te vervangen door nieuwe tekst, mogelijk gedefinieerd door een patroon. In het volgende voorbeeld wordt de System.Text.RegularExpressions.Regex klasse gebruikt om een patroon in een brontekenreeks te vinden en te vervangen door het juiste hoofdlettergebruik. De Regex.Replace(String, String, MatchEvaluator, RegexOptions) methode gebruikt een functie die de logica van de vervanging levert als een van de argumenten. In dit voorbeeld is die functie een lokale functie LocalReplaceMatchCase die is gedeclareerd in de voorbeeldmethode. LocalReplaceMatchCase gebruikt de System.Text.StringBuilder klasse om de vervangende tekenreeks te bouwen met het juiste hoofdlettergebruik.

Reguliere expressies zijn het handigst voor het zoeken en vervangen van tekst die een patroon volgt, in plaats van bekende tekst. Zie Tekenreeksen zoeken voor meer informatie. Met het zoekpatroon zoekt 'the\s' naar het woord 'the', gevolgd door een spatieteken. Dat deel van het patroon zorgt ervoor dat het niet overeenkomt met 'daar' in de brontekenreeks. Zie Regular Expression Language - Snelzoekgids voor meer informatie over reguliere expressietaalelementen.

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

De StringBuilder.ToString methode retourneert een onveranderbare tekenreeks met de inhoud in het StringBuilder object.

Afzonderlijke tekens wijzigen

U kunt een tekenmatrix maken op basis van een tekenreeks, de inhoud van de matrix wijzigen en vervolgens een nieuwe tekenreeks maken op basis van de gewijzigde inhoud van de matrix.

In het volgende voorbeeld ziet u hoe u een reeks tekens in een tekenreeks vervangt. Eerst wordt de String.ToCharArray() methode gebruikt om een matrix met tekens te maken. Hierbij wordt de IndexOf methode gebruikt om de beginindex van het woord 'fox' te vinden. De volgende drie tekens worden vervangen door een ander woord. Ten slotte wordt een nieuwe tekenreeks samengesteld uit de bijgewerkte tekenmatrix.

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

Programmatisch tekenreeksinhoud samenstellen

Omdat tekenreeksen onveranderbaar zijn, maken de vorige voorbeelden allemaal tijdelijke tekenreeksen of tekenmatrices. In scenario's met hoge prestaties kan het wenselijk zijn om deze heap-toewijzingen te voorkomen. .NET Core biedt een String.Create methode waarmee u programmatisch de tekeninhoud van een tekenreeks kunt invullen via een callback terwijl u de tussenliggende tijdelijke tekenreekstoewijzingen vermijdt.

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

U kunt een tekenreeks in een vast blok met onveilige code wijzigen, maar het wordt sterk afgeraden om de inhoud van de tekenreeks te wijzigen nadat een tekenreeks is gemaakt. Als u dit doet, worden dingen op onvoorspelbare manieren verbroken. Als iemand bijvoorbeeld een tekenreeks met dezelfde inhoud als die van u heeft, krijgt deze persoon uw kopie en verwacht niet dat u de tekenreeks wijzigt.

Zie ook