Nasıl bir dize C # çok karakterli bir ayırıcı ile bölmek?


232

Bir dizeyi sözcük olan bir sınırlayıcı kullanarak bölmek istersem ne olur?

Örneğin This is a sentence,.

Ben bölmek istiyorum isve almak Thisve a sentence.

İçinde Java, bir dize sınırlayıcı olarak gönderebilirsiniz, ama bunu nasıl başarabilirim C#?

Yanıtlar:


281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Dokümanlardan örnek:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}

7
Bu aslında şunu döndürür: Soruda verilen örnekle 'Th' '' 'bir cümle'. Belki de aslında istediği budur, ancak belirttiği şey bu değildir.
IRBMe

6
Bu sadece bir örnektir ... Nokta: Dizeleri sınırlayıcı olarak alan bir String.Split var.
bruno conde

1
Evet, ancak sorunun belirttiği şeyi yapmaz. Çıktıyı belirtmek için biraz daha akıllıca bir şey kullanmalısınız. Şimdi, belirtilen sorunun aslında askerin istediği şey olup olmadığı farklı bir sorudur, ancak burada sorulan soru sadece String.Split ile önemsiz bir şekilde cevaplanamaz.
IRBMe

3
Hala tam olarak çalışmıyor. Bölünecek sözcükteki boşlukları eklerseniz, çıktıya dahil edilmezler. Soruda verilen örneği incelerseniz, aslında boşlukları içerdiklerini fark edeceksiniz. "İs" üzerine bölmek size "Bu" ve "bir cümle" yerine "Bu" ve "bir cümle" verecektir. "Bu" nun sonundaki ve "bir cümlenin" başındaki ince boşluklara dikkat edin. Yine, bu cevap muhtemelen sorgulayıcının aslında istediği şeydir, ancak sorduğu şey değildir ve tekrar ediyorum, String.Split önemsiz bir şekilde çözmez.
IRBMe

2
Soruyu okudun mu? 'Ayrılmak istiyorum' is '. Böylece "Bu" ve "bir cümle" alacağım. Sonuçlardaki boşluklara bakın ??? Split'in yaptığı budur.
bruno conde

55

Aşağıdaki gibi Regex.Split yöntemini kullanabilirsiniz :

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Düzenleme : Bu, verdiğiniz örneği karşılar. Sıradan geldiğini hatırlatırız string.split da "bölünmüş olacak olan " kelimenin sonundaki "Bu", kullandığım dolayısıyla neden Regex yöntemi ile "etrafında kelime sınırları dahil olduğu ". Ancak, bu örneği yanlışlıkla yazdıysanız , String.Split'in muhtemelen yeterli olacağını unutmayın.


@ EDIT: Ben de emin değildi, ama yine de normal dize bölünmüş kullanabilirsiniz ve eğer amacı SADECE "is" kelimesini kaldırmak için her iki tarafta sadece boşlukları kullanabilirsiniz.
ahawker

1
Bu da işe yaramaz (en azından çok fazla çaba harcamadan), çünkü alanın dizede bölünen sözcüğün konumlarını bilmeden sola, sağa veya her ikisine birden gidip gitmeyeceğini bilmiyorsunuz .
IRBMe

String.Splity zaten bir dize bölmek sağlar gibi aşırı karmaşık görünüyor ...
Ed S.

3
Bunu cevabımdaki düzenlememde, yukarıdaki yorumda ve başka bir cevabın 3 yorumunda zaten ele aldım. String.Split , soruda sağlanan örnek için çalışmaz. Nedenini açıklayarak kendimi tekrar etmeyeceğim. Bilmek isterseniz diğer tüm yorumları okuyabilirsiniz.
IRBMe


34

Bu yayındaki mevcut yanıtlara dayanarak, bu uygulamayı basitleştirir :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}

9
+1, bir uzantı yöntemi için bağırır. Neredeyse aptalca bu aşırı yüklerden biri değil.
Todd Menier

9
@ToddMenier Ne demek "neredeyse"?
mwardm

28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

DÜZENLEME: Eğer gerçeği korumak amacıyla dizideki boşluklu her iki tarafta doldurulur "dır" sadece kelime istediğiniz cümle ve kelime "bu" sağlam kalmasına kaldırılır "dır".


8

...Kısacası:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);

5

İstediğiniz bölünmüş dizeyi dizede oluşmayan bir karakterle değiştirmek için String.Replace () öğesini kullanabilir ve sonra aynı efekt için sonuçtaki dizeyi bölmek üzere bu karakterde String.Split kullanabilirsiniz.


5

Veya bu kodu kullanın; (same: new String [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

Bölmeyi bir dize ayırıcıyla yapmak için bir uzantı işlevi:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Kullanım örneği:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));

19
Kod göndermeden önce, yapmadığınızı belirtmedikçe, muhtemelen önce bir derleyici üzerinden çalıştırmayı denemelisiniz. İlk satırda noktalı virgül var ve str1 & str2 tanımlanmamış. Kod aslında OP istediğini işe yaramaz bahsetmiyorum. Bu kod "Th" ve "çok daha kolay" olarak böler.
mandreko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.