Dividir cadeias de caracteres em subcadeias de caracteres em C#

Dica

Este artigo faz parte da seção Conceitos Básicos para desenvolvedores que já conhecem pelo menos uma linguagem de programação e estão aprendendo C#. Se você é novo em programação, comece com os tutoriais Comece agora.

Vem de outra linguagem?string.Split é o equivalente em C# a String.split do Java e String.prototype.split do JavaScript. Ao contrário dessas linguagens, C# retorna uma matriz (string[]), não uma lista e o argumento separador é um caractere ou cadeia de caracteres, não uma expressão regular. Para divisão baseada em padrão, consulte Regex.Split.

O String.Split método divide uma cadeia de caracteres em uma matriz de subcadeias de caracteres usando um ou mais separadores. É a maneira mais simples de analisar texto delimitado, como palavras, valores no estilo CSV ou tokens de protocolo.

O método tem muitas sobrecargas, mas elas abrangem quatro decisões independentes:

  • Separadores: um char, uma matriz de char, um stringou uma matriz de string.
  • Contagem máxima de resultados: limite o número de subcadeias de caracteres retornadas.
  • Tratamento de entrada vazia: mantenha as subcadeias de caracteres vazias (o padrão) ou solte-as com StringSplitOptions.RemoveEmptyEntries.
  • Tratamento de espaço em branco: corte o espaço em branco à esquerda e à direita de cada entrada com StringSplitOptions.TrimEntries.

Dividir uma cadeia de caracteres em palavras

Para dividir uma frase no espaço em branco, passe ' ' como o separador:

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

Iterar a matriz for retornada para recuperar a posição de cada palavra:

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

Se a entrada contiver instâncias repetidas do caractere separador, Split produzirá entradas vazias, uma para cada "lacuna" entre separadores consecutivos:

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

Passe StringSplitOptions.RemoveEmptyEntries para remover essas entradas vazias, conforme mostrado posteriormente neste artigo.

Dividir usando múltiplos caracteres separadores

Quando mais de um caractere pode atuar como separador, passe-os como uma matriz. O exemplo a seguir considera espaços, vírgulas, pontos, dois-pontos e tabulações como delimitadores de palavras:

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>

Separadores adjacentes ainda produzem entradas vazias:

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>

Dividir usando separadores de múltiplos caracteres

Para dividir usando separadores de palavras inteiras ou de vários caracteres, passe um array de strings. As sobrecargas de matriz de cadeia de caracteres exigem um StringSplitOptions valor. Use RemoveEmptyEntries quando separadores repetidos produziriam resultados vazios de outra forma:

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

Limite quantas substrings você recebe de volta

Passe um count argumento para limitar o número de resultados. A entrada final contém tudo o que resta, incluindo todos os separadores restantes:

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

Esse padrão é útil para key=value pares e outros formatos em que apenas o primeiro separador é significativo.

Cortar espaço em branco de cada entrada

StringSplitOptions.TrimEntries remove os espaços em branco no início e no fim de cada subcadeia retornada. Você pode combiná-lo com RemoveEmptyEntries para a limpeza típica no estilo 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>

Usar expressões regulares

Split funciona bem para delimitadores de caracteres ou cadeias de caracteres fixos. Para separação com base em padrão, use Regex.Split. Para obter uma introdução a expressões regulares em cadeias de caracteres, consulte operações de cadeia de caracteres.

Consulte também