HOWTO · Csharp

從 C# 中的字串中刪除字元

本文介紹四種從 C# 字串移除字元的方法:使用 string.Replace()、string.Split() 搭配 string.Join()、Regex.Replace(),以及 LINQ。

本頁內容

若要從 C# 字串中移除一個已知字元,請用該字元和 string.Empty 呼叫 string.Replace()。若要移除多個指定字元,請針對每個字元重複取代。字串是不可變的,因此每次呼叫都會傳回新的字串;若要保留變更,請將結果指定回變數。字元若是分隔符,請搭配使用 string.Split() 和 string.Join();若移除規則是字元模式,請使用 Regex.Replace();若規則是判斷要保留哪些字元,則可使用 LINQ。若要專門移除空白字元,請參閱如何從 C# 字串中移除空白字元。

使用 string.Replace() 移除字元

string.Replace() 會取代指定字元或子字串的每一次出現。將字元取代為 string.Empty,即可移除所有符合項目。以下範例會依序對指定集合中的每個字元執行取代;每次呼叫傳回的值都會成為下一次呼叫的輸入。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;

class Program
{
    static void Main()
    {
        string text = "Something @to ,Write.;';";
        char[] charactersToRemove = { '@', ',', '.', ';', '\'' };

        foreach (char character in charactersToRemove)
        {
            text = text.Replace(character.ToString(), string.Empty);
        }

        Console.WriteLine(text);
    }
}
Something to Write

若只要移除一個字元,也可以只呼叫一次,例如 text = text.Replace("@", string.Empty);。此方法會移除所有符合項目,而不只是第一個。如果指定集合很大,重複呼叫會重新掃描字串並建立中間字串;若字元篩選條件或正規表示式更能清楚表達規則,可以考慮改用它們。範例輸出顯示 Something to Write;這是英文輸入移除指定字元後的結果,輸出文字仍為英文。

使用 string.Split() 與 string.Join() 移除分隔符

string.Split() 會將指定的每個字元視為分隔符,並傳回分隔符之間的子字串。string.Join() 會使用你提供的分隔字串串接這些部分。若分隔字串是空字串,剩餘部分就會直接接在一起,分隔符也因此被移除。這是表達該操作的另一種方式,並不必然優於 string.Replace()。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;

class Program
{
    static void Main()
    {
        string text = "Something @to ,Write.;';";
        char[] delimiters = { '@', ',', '.', ';', '\'' };
        string result = string.Join(string.Empty,
            text.Split(delimiters, StringSplitOptions.RemoveEmptyEntries));

        Console.WriteLine(result);
    }
}
Something to Write

StringSplitOptions.RemoveEmptyEntries 會捨棄空字串片段;當分隔符相鄰,或位於字串開頭或結尾時,就可能產生這些空片段。對於範例中的輸入,串接分割後的片段會得到與取代迴圈相同的可見文字。若將字串拆成片段本身就有用途,可以採用這種方式;若只是要刪除字元,使用 string.Replace() 會更直接。範例輸出顯示 Something to Write;這是英文輸入移除指定分隔符後的結果,輸出文字仍為英文。

使用 Regex.Replace() 移除字元

Regex.Replace() 會取代所有符合正規表示式模式的子字串。像 [@,.;'] 這樣的字元類別會匹配清單中的任一個字元,因此將符合項目取代為 string.Empty,就能移除指定集合中的字元。在字元類別之外,. 等字元在正規表示式中有特殊意義;但在此字元類別中,句點代表字面上的句點。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "Something @to ,Write.;';";
        string result = Regex.Replace(text, "[@,.;']", string.Empty);

        Console.WriteLine(result);
    }
}
Something to Write

當移除規則是字元範圍或類別等模式,而不是短小且固定的清單時,正規表示式就很實用。若正規表示式中繼字元位於字元類別之外,而你要它們代表字面上的字元,請先將它們跳脫。若要處理固定清單,使用 string.Replace() 或 string.Split() 能讓指定要處理的字元更一目瞭然。範例輸出顯示 Something to Write;這是英文輸入移除符合模式的字元後的結果,輸出文字仍為英文。

使用 LINQ 篩選字元

LINQ 可以根據條件,從符合條件的字元建立新字串。此範例會保留空白、字母和數字,因此標點符號會被移除。這是依據字元屬性進行篩選,並非移除呼叫者任意指定的字元集合:凡是符合規則的字元都會保留,包括字母和空格。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string text = "Something @to ,Write.;';";
        string result = new string(text
            .Where(character => char.IsWhiteSpace(character)
                || char.IsLetterOrDigit(character))
            .ToArray());

        Console.WriteLine(result);
    }
}
Something to Write

若保留字元的條件最能清楚表達需求,請使用 LINQ。若需要不同的字元集合,可將 char.IsWhiteSpace 和 char.IsLetterOrDigit 換成符合你規則的述詞。若要移除呼叫者提供的特定字元清單,則可使用取代迴圈或相應的成員資格測試。範例輸出顯示 Something to Write;這是英文輸入經篩選後的結果,輸出文字仍為英文。