Разделение строк на подстроки в C#

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. Общие сведения о регулярных выражениях строк см. в разделе "Строки".

См. также