C'de dizeleri alt dizelere bölme#

İpucu

Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın.

Başka bir dilden mi geliyorsunuz?string.Split, C#'ta Java'daki String.split ve JavaScript'teki String.prototype.split yapılarının karşılığıdır. Bu dillerden farklı olarak, C# liste değil dizi ()string[] döndürür ve ayırıcı bağımsız değişkeni normal ifade değil karakter veya dizedir. Desen tabanlı bölme için bkz Regex.Split. .

yöntemi, String.Split bir veya daha fazla ayırıcı kullanarak bir dizeyi bir alt dize dizisine böler. Sözcükler, CSV stili değerler veya protokol belirteçleri gibi sınırlandırılmış metinleri ayrıştırmak için en basit yol budur.

Yöntemin birçok aşırı yüklemesi vardır, ancak dört bağımsız kararı kapsar:

  • Ayırıcılar: bir adet char, bir dizi char, bir adet string veya bir dizi string.
  • En yüksek sonuç sayısı: Döndürülen alt dize sayısını sınırla.
  • Boş girişlerin işlenmesi: boş alt dizeleri koruyun (varsayılan olarak) veya StringSplitOptions.RemoveEmptyEntries ile çıkarın.
  • Boşlukların işlenmesi: StringSplitOptions.TrimEntries ile her girdinin başındaki ve sonundaki boşlukları kırpın.

Bir dizeyi sözcüklere bölmek

Bir ifadeyi boşluk karakterine göre bölmek için ayırıcı olarak ' ' geçirin:

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

Her sözcüğün konumunu elde etmek için döndürülen diziyi for ile yineleyin:

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

Giriş, ayırıcı karakterin yinelenen örneklerini içeriyorsa, Split ardışık ayırıcılar arasındaki her "boşluk" için bir tane olan boş girdiler üretir:

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

Bu makalenin ilerleyen bölümlerinde gösterildiği gibi, bu boş girdileri hariç tutmak için StringSplitOptions.RemoveEmptyEntries değerini iletin.

Birden çok ayırıcı karakterine göre bölme

Birden fazla karakter ayırıcı görevi görebiliyorsa, bunları bir dizi olarak iletin. Aşağıdaki örnekte boşluklar, virgüller, nokta, iki nokta üst üste ve sekmelerin tümü sözcük sınırları olarak ele edilir:

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>

Bitişik ayırıcılar hala boş girdiler üretir:

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>

Çok karakterli ayırıcılara göre bölme

Tam sözcükler veya birden çok karakterden oluşan ayırıcılar üzerinden bölmek için bir dize dizisi iletin. Dize dizisi aşırı yüklemeleri bir StringSplitOptions değer gerektirir. Yinelenen ayırıcılar aksi takdirde boş sonuçlar verecekse RemoveEmptyEntries kullanın:

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

Geri alabileceğiniz alt dize sayısını sınırlayın

Sonuç sayısına üst sınır koymak için bir count argümanı iletin. Son girdi, kalan ayırıcılar da dahil olmak üzere geriye kalan her şeyi içerir:

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

Bu örüntü, yalnızca ilk ayırıcının önem taşıdığı key=value çiftleri ve diğer biçimler için kullanışlıdır.

Her girdiden boşluk kırpma

StringSplitOptions.TrimEntries döndürülen her alt dizenin başındaki ve sonundaki boşlukları kaldırır. Tipik CSV stili temizleme için bunu ile RemoveEmptyEntries birleştirebilirsiniz:

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>

Normal ifadeleri kullanma

Split sabit karakter veya dize sınırlayıcıları için iyi çalışır. Desen tabanlı bölme için kullanın Regex.Split. Dizelerdeki normal ifadelere giriş için bkz. Dize işlemleri.

Ayrıca bakınız