小提示
本文屬於 基礎部分, 適合已經至少懂一種程式語言並正在學習 C# 的開發者。 如果你是程式新手,建議先從 入門 教學開始。
您熟悉其他語言嗎?string.Split 是 C# 中對應 Java 的 String.split 和 JavaScript 的 String.prototype.split。 與這些語言不同,C# 回傳的是陣列(string[]),而非清單,分隔符參數是字元或字串,而非正則表達式。 關於基於模式的分割,請參見 Regex.Split。
此 String.Split 方法利用一個或多個分隔符將字串拆分成子串陣列。 這是解析分隔文字(如單字、CSV 風格值或協定標記)最簡單的方法。
此方法有許多超載,但涵蓋四個獨立決策:
-
分隔符:一個
char,一個 的陣列char,一個string,或一個 的陣列string。 - 最大結果計數:限制回傳的子字串數量。
- 空項目處理:保留空子字串(預設)或用 StringSplitOptions.RemoveEmptyEntries刪除。
- 空白處理:使用 StringSplitOptions.TrimEntries 移除每個項目前後的空白字元。
將字串分割成單字
若要在空白處分割片語,請將分隔符通過 ' ' :
string phrase = "The quick brown fox jumps over the lazy dog.";
string[] words = phrase.Split(' ');
foreach (var word in words)
{
Console.WriteLine($"<{word}>");
}
// => <The>
// => <quick>
// => <brown>
// => <fox>
// => <jumps>
// => <over>
// => <the>
// => <lazy>
// => <dog.>
使用 for 逐一走訪回傳的陣列,以取得每個字詞的位置:
string phrase = "The quick brown fox jumps over the lazy dog.";
string[] words = phrase.Split(' ');
for (int i = 0; i < words.Length; i++)
{
Console.WriteLine($"Index {i}: <{words[i]}>");
}
// => Index 0: <The>
// => Index 1: <quick>
// => Index 2: <brown>
// => ...
若輸入包含分隔符字元的重複實例, Split 則產生空項目,分別對應連續分隔符間的每個「空隙」:
string phrase = "The quick brown fox jumps over the lazy dog.";
string[] words = phrase.Split(' ');
foreach (var word in words)
{
Console.WriteLine($"<{word}>");
}
// The runs of spaces produce empty entries:
// => <The>
// => <quick>
// => <brown>
// => <>
// => <>
// => <>
// => <fox>
// => ...
傳入 StringSplitOptions.RemoveEmptyEntries 以捨棄那些空白項目,如本文稍後所示。
依多個分隔字元分割
當多個角色可以作為分隔符時,請以陣列方式傳遞它們。 以下範例將空格、逗號、句號、冒號和制表符都視為單字邊界:
char[] delimiters = [' ', ',', '.', ':', '\t'];
string text = "one\ttwo three:four,five six seven";
Console.WriteLine($"Original text: '{text}'");
string[] words = text.Split(delimiters);
Console.WriteLine($"{words.Length} words in text:");
foreach (var word in words)
{
Console.WriteLine($"<{word}>");
}
// => 7 words in text:
// => <one>
// => <two>
// => <three>
// => <four>
// => <five>
// => <six>
// => <seven>
相鄰的分隔符仍會產生空的條目:
char[] delimiters = [' ', ',', '.', ':', '\t'];
string text = "one\ttwo :,five six seven";
Console.WriteLine($"Original text: '{text}'");
string[] words = text.Split(delimiters);
Console.WriteLine($"{words.Length} words in text:");
foreach (var word in words)
{
Console.WriteLine($"<{word}>");
}
// => 7 words in text:
// => <one>
// => <two>
// => <>
// => <>
// => <five>
// => <six>
// => <seven>
依多字元分隔符號分割
若要以完整單字或多字元字串作為分隔符進行分割,請傳入字串陣列。 字串陣列過載需要一個 StringSplitOptions 值。 當重複分隔符會產生空結果時使用 RemoveEmptyEntries :
string[] separators = ["<<", "..."];
string text = "one<<two......three<four";
Console.WriteLine($"Original text: '{text}'");
string[] words = text.Split(separators, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine($"{words.Length} substrings in text:");
foreach (var word in words)
{
Console.WriteLine(word);
}
// => 3 substrings in text:
// => one
// => two
// => three<four
限制你回傳的子字串數量
通過 count 一個論證來限制結果數量。 最後一個項目包含所有剩餘內容,包括任何剩餘的分隔符號:
string phrase = "The quick brown fox jumps over the lazy dog.";
string[] words = phrase.Split(' ', 4, StringSplitOptions.None);
foreach (var word in words)
{
Console.WriteLine($"<{word}>");
}
// => <The>
// => <quick>
// => <brown>
// => <fox jumps over the lazy dog.>
此模式對於 key=value 對應及其他格式非常有用,因為只有第一個分隔符有意義。
移除每個項目的空白字元
StringSplitOptions.TrimEntries 會移除每個傳回子字串前導與尾端的空白字元。 你可以將它與 RemoveEmptyEntries 搭配使用,進行典型的 CSV 風格清理:
string numerals = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10";
string[] trimmed = numerals.Split(',', StringSplitOptions.TrimEntries);
Console.WriteLine("Trimmed entries:");
foreach (var word in trimmed)
{
Console.WriteLine($"<{word}>");
}
string[] untrimmed = numerals.Split(',', StringSplitOptions.None);
Console.WriteLine("Untrimmed entries:");
foreach (var word in untrimmed)
{
Console.WriteLine($"<{word}>");
}
// => Trimmed entries: <1> <2> ... <10>
// => Untrimmed entries: <1> < 2> ... < 10>
使用正則表達式
Split 對於固定字元或字串分隔符效果良好。 若要依模式分割,請使用 Regex.Split。 關於字串上正則表達式的介紹,請參見 字串運算。