Suddividere le stringhe in sottostringhe in C#

Suggerimento

Questo articolo fa parte della sezione Nozioni fondamentali per gli sviluppatori che già conoscono almeno un linguaggio di programmazione e stanno imparando C#. Se non si ha familiarità con la programmazione, iniziare prima con le esercitazioni introduttive .

Provieni da un altro linguaggio?string.Split è la controparte in C# di String.split in Java e di String.prototype.split in JavaScript. A differenza di questi linguaggi, C# restituisce una matrice (string[]), non un elenco e l'argomento separatore è un carattere o una stringa, non un'espressione regolare. Per la suddivisione basata su criteri, vedere Regex.Split.

Il String.Split metodo suddivide una stringa in una matrice di sottostringhe usando uno o più separatori. È il modo più semplice per analizzare testo delimitato, ad esempio parole, valori in stile CSV o token di protocollo.

Il metodo ha molti overload, ma riguardano quattro decisioni indipendenti:

  • Separatori: uno char, una matrice di char, una stringo una matrice di string.
  • Numero massimo di risultati: limite del numero di sottostringhe restituite.
  • Gestione degli elementi vuoti: mantenere le sottostringhe vuote (impostazione predefinita) oppure ometterle con StringSplitOptions.RemoveEmptyEntries.
  • Gestione degli spazi vuoti: tagliare gli spazi vuoti iniziali e finali da ogni voce con StringSplitOptions.TrimEntries.

Dividere una stringa in parole

Per dividere una frase negli spazi vuoti, passare ' ' come separatore:

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

Scorrere la matrice restituita con for per recuperare la posizione di ogni parola:

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 l'input contiene occorrenze ripetute del carattere separatore, Split produce elementi vuoti, uno per ogni "intervallo" tra separatori consecutivi:

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

Usa StringSplitOptions.RemoveEmptyEntries per eliminare gli elementi vuoti, come illustrato più avanti in questo articolo.

Suddividi in base a più caratteri separatori

Quando più di un carattere può fungere da separatore, passali come un array. L'esempio seguente considera spazi, virgole, punti, due punti e tabulazioni tutti come delimitatori di parola:

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>

I separatori adiacenti producono ancora elementi vuoti:

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>

Suddivisione su separatori composti da più caratteri

Per suddividere usando separatori costituiti da parole intere o da più caratteri, passare un array di stringhe. Gli overload di array di stringhe richiedono un valore StringSplitOptions. Usare RemoveEmptyEntries quando i separatori ripetuti generano in caso contrario risultati vuoti:

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

Limitare il numero di sottostringhe restituite

Passa l'argomento count per limitare il numero di risultati. La voce finale contiene tutto ciò che resta, inclusi eventuali separatori residui:

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

Questo modello è utile per key=value le coppie e altri formati in cui solo il primo separatore è significativo.

Rimuovi gli spazi vuoti da ogni voce

StringSplitOptions.TrimEntries rimuove spazi vuoti iniziali e finali da ogni sottostringa restituita. È possibile combinarlo con RemoveEmptyEntries per la pulizia tipica in stile 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>

Usare espressioni regolari

Split funziona bene per delimitatori di caratteri o stringhe fissi. Per la suddivisione basata su pattern, utilizzare Regex.Split. Per un'introduzione alle espressioni regolari sulle stringhe, vedere Operazioni sulle stringhe.

Vedere anche