Dzielenie ciągów na podciągy w języku C#

Wskazówka

Ten artykuł jest częścią sekcji Podstawy dla deweloperów, którzy już znają co najmniej jeden język programowania i uczą się języka C#. Jeśli dopiero zaczynasz programować, najpierw zacznij od samouczków Wprowadzenie .

Przechodzisz z innego języka?string.Split to odpowiednik elementów String.split w Javie i String.prototype.split w JavaScripcie. W przeciwieństwie do tych języków język C# zwraca tablicę (string[]), a nie listę, a argument separatora jest znakiem lub ciągiem, a nie wyrażeniem regularnym. Aby zapoznać się z podziałem opartym na wzorcu, zobacz Regex.Split.

Metoda String.Split dzieli ciąg na tablicę podciągów przy użyciu co najmniej jednego separatora. Jest to najprostszy sposób analizowania rozdzielanego tekstu, takiego jak wyrazy, wartości w stylu CSV lub tokeny protokołu.

Metoda ma wiele przeciążeń, ale sprowadzają się one do czterech niezależnych wyborów:

  • Separatory: jeden char, tablica elementów char, jeden string lub tablica elementów string.
  • Maksymalna liczba wyników: limit liczby zwracanych podciągów.
  • Obsługa pustych elementów: zachowuj puste ciągi (domyślnie) lub pomijaj je za pomocą StringSplitOptions.RemoveEmptyEntries.
  • Obsługa białych znaków: usuń białe znaki na początku i na końcu w każdym wpisie za pomocą StringSplitOptions.TrimEntries

Dzielenie ciągu na wyrazy

Aby podzielić frazę na białe znaki, przekaż ' ' jako separator:

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.>

Przeiteruj zwróconą tablicę za pomocą for, aby ustalić pozycję każdego słowa:

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>
// => ...

Jeśli dane wejściowe zawierają powtórzone wystąpienia znaku separatora, Split tworzy puste elementy, po jednym dla każdej „przerwy” między kolejnymi separatorami:

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>
// => ...

Przekaż StringSplitOptions.RemoveEmptyEntries , aby usunąć te puste wpisy, jak pokazano w dalszej części tego artykułu.

Dzielenie przy użyciu wielu znaków separatora

Gdy więcej niż jeden znak może służyć jako separator, przekaż je jako tablicę. Poniższy przykład traktuje spacje, przecinki, kropki, dwukropki i tabulatory jako granice wyrazów:

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>

Sąsiadujące separatory nadal generują puste elementy:

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>

Dzielenie przy użyciu separatorów wieloznakowych

Aby podzielić tekst według separatorów będących całymi wyrazami lub separatorów wieloznakowych, przekaż tablicę ciągów znaków. Przeciążenia dla tablicy ciągów znaków wymagają wartości StringSplitOptions. Użyj elementu RemoveEmptyEntries, gdy powtarzające się separatory w przeciwnym razie dawałyby puste wyniki:

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

Ogranicz liczbę zwracanych podciągów

count Przekaż argument, aby ograniczyć liczbę wyników. Ostatni wpis zawiera wszystko, co pozostało, w tym wszelkie pozostałe separatory:

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.>

Ten wzorzec jest przydatny w przypadku key=value par i innych formatów, w których ma znaczenie tylko pierwszy separator.

Usuń białe znaki z każdego elementu

StringSplitOptions.TrimEntries usuwa początkowe i końcowe białe znaki z każdego zwracanego podciągu. Możesz połączyć to z RemoveEmptyEntries, aby wykonać typowe czyszczenie w stylu 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>

Używanie wyrażeń regularnych

Split Działa dobrze w przypadku ograniczników znaków stałych lub ciągów. W przypadku dzielenia opartego na wzorcu użyj polecenia Regex.Split. Aby zapoznać się z informacjami wprowadzającymi o wyrażeniach regularnych dla ciągów znaków, zobacz Operacje na ciągach znaków.

Zobacz także