Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Tip
Эта статья является частью раздела "Основы" для разработчиков , которые уже знают хотя бы один язык программирования и учат 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. Общие сведения о регулярных выражениях строк см. в разделе "Строки".