Membagi string dengan string lain di C #

682

Saya telah menggunakan Split()metode ini untuk membagi string, tetapi ini hanya berfungsi jika Anda memisahkan sebuah string dengan sebuah karakter. Apakah ada cara untuk membagi astring , dengan string lain menjadi parameter yang dibagi?

Saya sudah mencoba mengubah splitter menjadi array karakter, tanpa hasil.

Dengan kata lain, saya ingin membagi string:

THExxQUICKxxBROWNxxFOX

oleh xx, dan mengembalikan array dengan nilai:

THE, CEPAT, COKLAT, FOX

Brandon
sumber
2
Untuk masalah di masa mendatang: Salah satu komentar di bawah ini membuat saya tertarik, jadi saya memutuskan untuk membuka diskusi tentang rekayasa perangkat lunak mengenai cara yang tidak intuitif (tapi benar) untuk melakukannya dalam jawaban yang diterima.
scharette

Jawaban:

1239

Untuk membaginya dengan string, Anda harus menggunakan string array yang berlebihan .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Adam Robinson
sumber
4
Saya akhirnya mengubah jawaban saya untuk ini karena 2 alasan: # 1: Untuk menangani pemisahan yang ingin saya lakukan, saya perlu menggunakan Regex.Escape, karena string split saya sering kali mengandung tanda bintang, dll. # 2: Sementara program ini Saya menulis tidak perlu optimasi nyata, tampaknya ada overhead tambahan yang terlibat dengan menggunakan metode Regex Split.
Brandon
7
@ Peter: Dalam posting itu Jon menyarankan itu karena poster tidak memiliki pembatas tetap; dia mencari untuk memisahkan string yang dipisahkan oleh "lebih dari satu spasi" (artinya 2+). Untuk string yang dibatasi oleh suatu pola daripada nilai , RegEx adalah opsi yang bagus (yah, satu - satunya ). Untuk pembatas nilai tetap, ini memperkenalkan overhead yang tidak perlu. Coba jalankan tes; karena jumlah operasi meningkat, RegEx akhirnya mengambil sekitar ~ 10x selama sesuai string.Split.
Adam Robinson
9
Saya datang dari Python ke C #. Python mendukung pemisahan string dengan string lain. Dan saya sering harus kembali ke pertanyaan ini untuk jawaban sederhana string[] Split(string pattern), yang merupakan penggunaan paling alami yang bisa saya pikirkan tetapi belum ada. Saya menulis C sebelum jadi saya terbiasa dengan array ar tapi saya masih benci melihat char[]muncul dalam kode C # karena tiba-tiba menarik perhatian saya dari level stream ke level byte. Adakah yang tahu mengapa orang-orang C # library mendesain metode Split seperti ini? Jika ada alasan yang bagus, saya mungkin bisa mencoba untuk menghargainya meskipun tidak nyaman.
foresightyj
11
Cuplikan ini berperingkat sangat tinggi dalam daftar hal-hal yang membuat saya malu untuk menunjukkan kepada pengembang yang bukan C #.
Traubenfuchs
99
Kenapa kita tidak bisa begitu saja melakukannya data.Split("xx")?
mcont
122

Ada kelebihan Split yang membutuhkan string.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Anda dapat menggunakan salah satu dari StringSplitOptions ini

  • Tidak ada - Nilai kembali mencakup elemen array yang berisi string kosong
  • RemoveEmptyEntries - Nilai kembali tidak termasuk elemen array yang berisi string kosong

Jadi jika stringnya adalah "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Noneakan mengembalikan entri kosong dalam array untuk bagian "xxxx" sementara StringSplitOptions.RemoveEmptyEntriestidak akan.

Greg
sumber
73
Regex.Split(string, "xx")

adalah cara saya melakukannya biasanya.


Tentu saja Anda akan membutuhkan:

using System.Text.RegularExpressions;

atau :

System.Text.RegularExpressions.Regex.Split(string, "xx")

tetapi sekali lagi saya membutuhkan perpustakaan itu sepanjang waktu.

Peter
sumber
13
@ Brandon: Walaupun saya biasanya memperingatkan terhadap pengoptimalan prematur, Anda harus menyadari bahwa RegEx.Splita sedikit lebih mahal daripada yang sederhana String.Splitkarena overhead ekspresi reguler.
Adam Robinson
9
Jika Anda ingin membaginya dengan string arbitrer, gunakan dulu Regex.Escapepada string, ini akan luput dari setiap meta-karakter regex.
Richard
salah satu keuntungan utama yang mungkin dibayar untuk overhead adalah kemampuan untuk menyediakan pengaturan perbandingan string
Timur Sadykov
47

Ada kelebihan String. Meletakkan untuk ini:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
bruno conde
sumber
1
Satu-satunya jawaban yang menghapus deklarasi tipe array yang tidak perlu.
wonea
25

Saya biasanya suka menggunakan ekstensi saya sendiri untuk itu:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Namun ini akan menyebabkan Pengecualian, jika Microsoft memutuskan untuk memasukkan metode-kelebihan ini di versi yang lebih baru. Itu juga kemungkinan alasan mengapa Microsoft belum memasukkan metode ini untuk sementara waktu: Setidaknya satu perusahaan tempat saya bekerja, menggunakan ekstensi semacam itu di semua proyek C # mereka.

Dimungkinkan juga untuk menentukan secara kondisional metode saat runtime jika tidak ada.

Lorenz Lo Sauer
sumber
4
Atau, gunakan params string[] splittersebagai parameter kedua dan ubah new[] {splitter}ke splitteruntuk mendukung beberapa pembatas.
Matthew Strawbridge
10

Jawaban sebelumnya semuanya benar. Saya melangkah lebih jauh dan membuat C # bekerja untuk saya dengan mendefinisikan metode ekstensi pada String:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

Dengan begitu saya bisa menyebutnya pada string apa pun dengan cara sederhana yang secara naif saya harapkan saat pertama kali saya mencoba menyelesaikan ini:

"a big long string with stuff to split on".Split("g str");
Argyle
sumber
7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Pilih saja karakter pengganti dengan hati-hati (pilih karakter yang kemungkinan tidak ada di string)!

Merobek
sumber
2
@MasoudHosseini: Silakan baca jawaban lengkapnya; sudah ada penafian.
SNag
3
@ kobe: Karena ini hack yang buruk.
Overv
3
Berfungsi dengan baik, tetapi berbahaya untuk metode generik
Kaizonaro
5
Memposting penjelasan seperti, "Ini hack yang mengerikan" atau "jawaban yang buruk" tidak membantu. Itu hanya pendapat tanpa penjelasan. Alih-alih, menyatakan sesuatu seperti "Tidak perlu memindai string untuk penggantian dan kemudian memindai karakter yang terpecah karena mengarah pada kinerja yang buruk." akan menjadi cara yang lebih baik untuk menjelaskan diri sendiri. Terlalu banyak programmer bertindak seperti ini. :(
Matt Ruwe
1
Bagaimana jika string sudah mengandung |char, karena alasan ini saya pikir itu berbahaya untuk digunakan.
amd
-1

Ini juga mudah:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
pengguna890255
sumber
1
Tapi ini juga akan terpecah di "THExQUICK"mana kita tidak ingin itu
terpecah
Terima kasih Rafalon: ya, jawaban Greg adalah yang terbaik: data.Split (string baru [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255
-4

Cara termudah adalah menggunakan String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

Atau lebih sederhana:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");
pengguna3458227
sumber
3
Seperti ini, ini tidak akan mengembalikan array (seperti pertanyaannya), hanya string dengan koma di mana xxitu.
Arj
Dan tidak hanya itu jika string berisi koma tambahan Anda tidak akan dapat membagi kata-kata dengan benar.
user3658298