如何在 C# 中修改字串內容
本文示範多種技術,會藉由修改現有的 string
來產生 string
。 所有示範的技術均會傳回修改結果,作為新的 string
物件。 為證明原始與修改過的字串是不同的執行個體,範例會將結果儲存在新變數中。 您可以在執行每個範例時,檢查原始 string
與修改過的新 string
。
注意
本文中的 C# 範例會在 Try.NET 內嵌程式碼執行器和測試區執行。 選取 [執行] 按鈕以在互動式視窗中執行範例。 執行程式碼之後,您便可以修改它,並再選取一次 [執行] 來執行修改過的程式碼。 修改過的程式碼會在互動式視窗中執行,或是如果編譯失敗的話,互動式視窗會顯示所有 C# 編譯器錯誤訊息。
本文示範了多種技術。 您可以取代現有的文字。 您可以搜尋模式,並以其他文字取代相符的文字。 您可以將字串視為一串字元。 您也可以使用便利的方法來移除空白字元。 選擇最符合您案例的技術。
取代文字
下列程式碼會以替代項目取代現有文字,來建立新的字串。
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}>");
上述程式碼示範了字串的「固定」屬性。 您可以看到在上述程式碼中,原本的字串 source
並未受到修改。 String.Replace 方法會建立包含修改項目的新 string
。
Replace 方法可取代字串或單一字元。 在這兩種情況下,所找到之文字的每個項目均會受到取代。 下列範例將所有 ' ' 字元取代為 '_':
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);
來源字串不會變更,而會傳回附帶取代項目的新字串。
修剪空白字元
您可使用 String.Trim、String.TrimStart 及 String.TrimEnd 方法來移除所有開頭和結尾的空白字元。 下列程式碼將示範各項作業。 來源字串不會變更,這些方法會傳回附帶已修改內容的新字串。
// 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}>");
移除文字
您可使用 String.Remove 方法來移除字串中的文字。 此方法會從特定索引開始移除一些數字。 下列範例示範了如何在 String.IndexOf 後面使用 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);
取代相符的模式
您可使用規則運算式以新文字取代文字相符模式,可由模式定義。 下列範例使用 System.Text.RegularExpressions.Regex 類別在來源字串中尋找模式,並以適當的大小寫加以取代。 Regex.Replace(String, String, MatchEvaluator, RegexOptions) 方法會以提供取代項目邏輯的函式作為其引數之一。 在此範例中,該函式 LocalReplaceMatchCase
是在範例方法中宣告的區域函式。 LocalReplaceMatchCase
會使用 System.Text.StringBuilder 類別以適當的大小寫來建置取代字串。
規則運算式在搜尋及取代遵循模式的文字時相當實用,但對於已知文字則否。 如需詳細資訊,請參閱如何搜尋字串。 搜尋模式 "the\s" 會搜尋後面接著空白字元的字組 "the"。 模式的該部分會確認其不會對應來源字串中的 "there"。 如需規則運算式語言元素的詳細資訊,請參閱規則運算式語言 - 快速參考。
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;
}
}
StringBuilder.ToString 方法會傳回固定字串,其中包含 StringBuilder 物件中的內容。
修改個別字元
您可從字串產生字元陣列、修改陣列內容,然後從陣列中修改的內容建立新的字串。
下列範例示範了如何在字串中取代一組字元。 首先,使用 String.ToCharArray() 方法來建立字元陣列。 其會使用 IndexOf 方法來尋找 "fox" 這個字的起始索引。接下來的三個字元會取代為不同的字。 最後,會從更新的字元陣列建構新字串。
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);
以程式設計方式建置字串內容
字串是不可變的,因此上述範例都會建立暫存字串或字元陣列。 在高效能案例中,建議您避免這些堆積配置。 .NET Core 提供一種 String.Create 方法,可讓您透過回撥,以程式設計方式填入字串的字元內容,同時避免中繼暫存字串配置。
// 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);
您可以使用不安全的程式碼修改固定區塊中的字串,但強烈建議不要在建立字串之後修改字串內容。 如此會以無法預期的方式中斷內容。 例如,如果有人實習與您擁有相同內容的字串,其會取得您的複本,而且不會預期您正在修改其字串。