Bagaimana cara membagi string dengan pembatas multi-karakter dalam C #?

232

Bagaimana jika saya ingin membagi string menggunakan pembatas yang merupakan kata?

Sebagai contoh This is a sentence,.

Saya ingin membagi isdan mendapatkan Thisdan a sentence.

Di Java, saya dapat mengirim string sebagai pembatas, tetapi bagaimana cara melakukannya C#?

Saobi
sumber

Jawaban:

281

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

Contoh dari dokumen:

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);
}
bruno conde
sumber
7
Ini sebenarnya mengembalikan: 'Th' '' 'sebuah kalimat' dengan contoh yang diberikan dalam pertanyaan. Mungkin ini yang sebenarnya dia inginkan, tapi itu bukan yang dia tentukan.
IRBMe
6
Ini hanyalah sebuah contoh ... Intinya adalah: Ada sebuah String.Split yang mengambil string sebagai pembatas.
Bruno conde
1
Ya, tetapi tidak melakukan apa yang ditentukan pertanyaan. Anda harus menggunakan sesuatu yang sedikit lebih pintar untuk mendapatkan output yang ditentukan. Sekarang, apakah pertanyaan yang ditentukan sebenarnya apa yang diinginkan oleh penanya adalah pertanyaan yang berbeda, tetapi pertanyaan yang diajukan di sini tidak dapat dijawab sepele hanya dengan String.Split.
IRBMe
3
Masih tidak bekerja. Jika Anda memasukkan spasi dalam kata untuk dipisah, mereka tidak termasuk dalam output. Jika Anda memeriksa contoh yang diberikan dalam pertanyaan, Anda akan melihat bahwa mereka sebenarnya termasuk spasi. Memisahkan "adalah" akan memberi Anda "Ini" dan "sebuah kalimat" daripada "Ini" dan "sebuah kalimat". Perhatikan spasi halus di akhir "Ini" dan awal "sebuah kalimat". Sekali lagi, jawaban ini mungkin adalah apa yang sebenarnya diinginkan oleh si penanya, tetapi bukan itu yang dia tanyakan dan, saya ulangi, String . Slit tidak akan dengan mudah menyelesaikannya.
IRBMe
2
@IRBMe sudahkah Anda membaca pertanyaan? 'Saya ingin membagi pada "adalah". Jadi saya akan mendapatkan "Ini" dan "sebuah kalimat" '. Lihat spasi di hasil ??? Inilah yang dilakukan Split.
Bruno conde
55

Anda dapat menggunakan metode Regex.Split , seperti ini:

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

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

Sunting : Ini memenuhi contoh yang Anda berikan. Perhatikan bahwa String biasa. Plit juga akan terpecah pada " is " di akhir kata "This", maka dari itu mengapa saya menggunakan metode Regex dan memasukkan batas kata di sekitar " is ". Perhatikan, bagaimanapun, bahwa jika Anda baru saja menulis contoh ini karena kesalahan, maka String.Split mungkin akan cukup.

IRBMe
sumber
@ EDIT: Saya juga tidak yakin, tetapi Anda masih dapat menggunakan split string normal dan hanya mengisi spasi di kedua sisi jika tujuannya adalah HANYA menghapus kata "is".
ahawker
1
Itu juga tidak bekerja (setidaknya bukan tanpa banyak usaha), karena Anda tidak tahu apakah ruang harus di kiri, kanan atau keduanya tanpa mengetahui posisi kata yang terpecah dalam string .
IRBMe
Tampaknya terlalu rumit seperti String.Splity memungkinkan Anda untuk membagi pada string yang sudah ...
Ed S.
3
Saya sudah membahas ini dalam edit saya untuk jawaban saya, dalam komentar di atas dan dalam 3 komentar pada jawaban lain. String.Split tidak berfungsi untuk contoh yang diberikan dalam pertanyaan. Saya tidak akan mengulangi diri saya lagi dengan menjelaskan alasannya. Anda dapat membaca semua komentar lain jika Anda ingin tahu.
IRBMe
perhatikan bahwa metode split regex tidak menghapus pre delimiter dan trailing delimiter pada variabel ... :(
melaos
34

Berdasarkan tanggapan yang ada pada posting ini, ini menyederhanakan implementasinya :)

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);
        }


    }
}
eka808
sumber
9
+1, ini menjerit untuk metode ekstensi. Hampir konyol bahwa ini bukan salah satu kelebihan bawaan.
Todd Menier
9
@ToddMenier Apa maksudmu "hampir"?
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]);

EDIT: The "is" diisi pada kedua sisi dengan spasi di array untuk menjaga fakta bahwa Anda hanya ingin kata "is" dihapus dari kalimat dan kata "this" tetap utuh.

ahawker
sumber
8

...Pendeknya:

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

Anda bisa menggunakan String.Replace () untuk mengganti string split yang Anda inginkan dengan karakter yang tidak muncul dalam string dan kemudian menggunakan String. Letakkan pada karakter itu untuk membagi string yang dihasilkan untuk efek yang sama.

Paul Sonier
sumber
5

Atau gunakan kode ini; (sama: String baru [])

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

Berikut ini adalah fungsi ekstensi untuk melakukan pemisahan dengan pemisah string:

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

Contoh penggunaan:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");
SteveD
sumber
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="[email protected][email protected]";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in
Prabu
sumber
-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));
Susmeet Khaire
sumber
19
Sebelum memposting kode, Anda mungkin harus mencoba menjalankannya melalui kompiler terlebih dahulu, kecuali Anda menyatakan belum melakukannya. Ada titik koma yang hilang dari baris pertama, dan str1 & str2 tidak didefinisikan. Belum lagi bahwa kode sebenarnya tidak berfungsi seperti yang diinginkan OP. Kode ini membaginya menjadi "Th" dan "jauh lebih mudah".
mandreko