Jak zmodyfikować zawartość ciągu w języku C#
W tym artykule przedstawiono kilka technik tworzenia elementu string
przez zmodyfikowanie istniejącego string
elementu . Wszystkie techniki wykazały zwrócenie wyniku modyfikacji jako nowego string
obiektu. Aby zademonstrować, że oryginalne i zmodyfikowane ciągi są odrębnymi wystąpieniami, przykłady przechowują wynik w nowej zmiennej. Podczas uruchamiania każdego przykładu można sprawdzić oryginalną string
i nową, zmodyfikowaną string
.
Uwaga
Przykłady języka C# w tym artykule są uruchamiane w Try.NET wbudowanym modułem uruchamiającym kod i placem zabaw. Wybierz przycisk Uruchom, aby uruchomić przykład w oknie interaktywnym. Po wykonaniu kodu można go zmodyfikować i uruchomić zmodyfikowany kod, wybierając pozycję Uruchom ponownie. Zmodyfikowany kod jest uruchamiany w oknie interaktywnym lub, jeśli kompilacja zakończy się niepowodzeniem, w oknie interaktywnym zostaną wyświetlone wszystkie komunikaty o błędach kompilatora języka C#.
W tym artykule przedstawiono kilka technik. Możesz zastąpić istniejący tekst. Możesz wyszukać wzorce i zastąpić pasujący tekst innym tekstem. Ciąg można traktować jako sekwencję znaków. Możesz również użyć metod wygody, które usuwają białe znaki. Wybierz techniki, które najlepiej pasują do danego scenariusza.
Zamień tekst
Poniższy kod tworzy nowy ciąg, zastępując istniejący tekst zastępcą.
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}>");
Powyższy kod demonstruje tę niezmienną właściwość ciągów. W poprzednim przykładzie widać, że oryginalny ciąg , source
nie jest modyfikowany. Metoda String.Replace tworzy nową string
zawartość zawierającą modyfikacje.
Metoda Replace może zastąpić ciągi lub pojedyncze znaki. W obu przypadkach każde wystąpienie szukanego tekstu jest zastępowane. Poniższy przykład zastępuje wszystkie znaki " " znaki "_":
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);
Ciąg źródłowy jest niezmieniony, a nowy ciąg jest zwracany z zastąpieniem.
Przycinanie białych znaków
Możesz użyć String.Trimmetod , String.TrimStarti String.TrimEnd , aby usunąć wszystkie wiodące lub końcowe białe znaki. Poniższy kod przedstawia przykład każdego z nich. Ciąg źródłowy nie zmienia się; metody te zwracają nowy ciąg ze zmodyfikowaną zawartością.
// 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}>");
Usuń tekst
Tekst z ciągu można usunąć przy użyciu String.Remove metody . Ta metoda usuwa liczbę znaków rozpoczynających się od określonego indeksu. W poniższym przykładzie pokazanoRemove, jak za pomocą instrukcji String.IndexOf usunąć tekst z ciągu:
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);
Zastępowanie pasujących wzorców
Możesz użyć wyrażeń regularnych , aby zastąpić wzorce dopasowywania tekstu nowym tekstem, prawdopodobnie zdefiniowanym przez wzorzec. W poniższym przykładzie użyto System.Text.RegularExpressions.Regex klasy do znalezienia wzorca w ciągu źródłowym i zastąpienia go odpowiednimi literami. Metoda Regex.Replace(String, String, MatchEvaluator, RegexOptions) przyjmuje funkcję, która zapewnia logikę zamiany jako jeden z jego argumentów. W tym przykładzie ta funkcja LocalReplaceMatchCase
jest funkcją lokalną zadeklarowaną wewnątrz przykładowej metody. LocalReplaceMatchCase
System.Text.StringBuilder używa klasy do skompilowania ciągu zastępczego z odpowiednią kapitalizacją.
Wyrażenia regularne są najbardziej przydatne do wyszukiwania i zastępowania tekstu, który jest zgodny ze wzorcem, a nie znanym tekstem. Aby uzyskać więcej informacji, zobacz Jak wyszukiwać ciągi. Wzorzec wyszukiwania "the\s" wyszukuje słowo "the", po którym następuje znak odstępu. Ta część wzorca gwarantuje, że nie jest zgodna z ciągiem źródłowym. Aby uzyskać więcej informacji na temat elementów języka wyrażeń regularnych, zobacz Język wyrażeń regularnych — szybka dokumentacja.
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;
}
}
Metoda StringBuilder.ToString zwraca niezmienny ciąg z zawartością StringBuilder obiektu.
Modyfikowanie pojedynczych znaków
Tablicę znaków można utworzyć na podstawie ciągu, zmodyfikować zawartość tablicy, a następnie utworzyć nowy ciąg na podstawie zmodyfikowanej zawartości tablicy.
W poniższym przykładzie pokazano, jak zastąpić zestaw znaków w ciągu. Najpierw używa String.ToCharArray() metody do utworzenia tablicy znaków. Używa IndexOf metody do znalezienia indeksu początkowego słowa "fox". Następne trzy znaki są zastępowane innym słowem. Na koniec nowy ciąg jest tworzony z zaktualizowanej tablicy znaków.
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);
Programowe tworzenie zawartości ciągu
Ponieważ ciągi są niezmienne, poprzednie przykłady tworzą tymczasowe ciągi lub tablice znaków. W scenariuszach o wysokiej wydajności pożądane może być uniknięcie tych alokacji sterty. Platforma .NET Core udostępnia metodę String.Create , która umożliwia programowe wypełnianie zawartości znaków ciągu za pośrednictwem wywołania zwrotnego przy jednoczesnym unikaniu tymczasowych alokacji ciągów pośrednich.
// 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);
Można zmodyfikować ciąg w stałym bloku z niebezpiecznym kodem, ale zdecydowanie odradza się modyfikowanie zawartości ciągu po utworzeniu ciągu. To spowoduje przerwanie rzeczy w nieprzewidywalny sposób. Jeśli na przykład ktoś internuje ciąg, który ma taką samą zawartość jak Ty, otrzyma kopię i nie będzie oczekiwać, że modyfikujesz ich ciąg.