Tekenreeksen splitsen in subtekenreeksen in C#

Aanbeveling

Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Als u nieuw bent in programmeren, begint u eerst met de Aan de slag-handleidingen.

Kom je uit een andere programmeertaal?string.Split is in C# de tegenhanger van Java's String.split en JavaScripts String.prototype.split. In tegenstelling tot deze talen retourneert C# een matrix (string[]), geen lijst en is het scheidingsteken een teken of tekenreeks, geen reguliere expressie. Zie voor het splitsen Regex.Splitop basis van patronen.

De String.Split methode breekt een tekenreeks op in een matrix met subtekenreeksen met behulp van een of meer scheidingstekens. Het is de eenvoudigste manier om tekst met scheidingstekens te parseren, zoals woorden, CSV-stijlwaarden of protocoltokens.

De methode heeft veel overbelastingen, maar ze hebben betrekking op vier onafhankelijke beslissingen:

  • Scheidingstekens: één char, een matrix van char, een stringof een matrix van string.
  • Maximumaantal resultaten: het aantal geretourneerde subtekenreeksen beperken.
  • Verwerking van lege invoer: bewaar lege subtekenreeksen (de standaardinstelling) of zet ze neer met StringSplitOptions.RemoveEmptyEntries.
  • Verwerking van witruimte: voorloop- en volgwitruimte van elk item verwijderen met StringSplitOptions.TrimEntries.

Een tekenreeks splitsen in woorden

Als u een woordgroep wilt splitsen op spaties, geeft u ' ' door als scheidingsteken:

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

Itereer met for over de geretourneerde array om de positie van elk woord te achterhalen:

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

Als de invoer meerdere opeenvolgende scheidingstekens bevat, produceert Split lege items, één voor elke tussenruimte tussen opeenvolgende scheidingstekens:

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

Geef StringSplitOptions.RemoveEmptyEntries door om die lege items weg te laten, zoals verderop in dit artikel wordt getoond.

Splitsen op meerdere scheidingstekens

Wanneer meer dan één teken als scheidingsteken kan fungeren, geeft u deze door als een matrix. In het volgende voorbeeld worden spaties, komma's, punten, dubbele punten en tabbladen als woordgrenzen behandeld:

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>

Aangrenzende scheidingstekens produceren nog steeds lege vermeldingen:

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>

Splitsen op scheidingstekens van meerdere tekens

Als u wilt splitsen op basis van scheidingstekens die uit hele woorden of meerdere tekens bestaan, geeft u een array van tekenreeksen door. Voor de overbelasting van tekenreeksmatrix is een StringSplitOptions waarde vereist. Gebruik RemoveEmptyEntries wanneer herhaalde scheidingstekens anders tot lege resultaten leiden:

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

Beperken hoeveel subtekenreeksen u terugkrijgt

Geef een count argument door om het aantal resultaten te caperen. De laatste vermelding bevat alles wat er nog is, inclusief eventuele resterende scheidingstekens:

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

Dit patroon is handig voor key=value paren en andere indelingen waarbij alleen het eerste scheidingsteken zinvol is.

Overtollige witruimte uit elke invoer verwijderen

StringSplitOptions.TrimEntries verwijdert voorloopspaties en volgspaties uit elke geretourneerde substring. U kunt het combineren met RemoveEmptyEntries voor gebruikelijke opschoning in CSV-stijl:

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>

Reguliere expressies gebruiken

Split werkt goed voor vaste teken- of tekenreeksscheidingstekens. Gebruik Regex.Split voor splitsen op basis van patronen. Zie Tekenreeksbewerkingen voor een inleiding tot reguliere expressies voor tekenreeksen.

Zie ook