共用方式為


如何在 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.TrimString.TrimStartString.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);

您可以使用不安全的程式碼修改固定區塊中的字串,但強烈建議不要在建立字串之後修改字串內容。 如此會以無法預期的方式中斷內容。 例如,如果有人實習與您擁有相同內容的字串,其會取得您的複本,而且不會預期您正在修改其字串。

另請參閱