Katakanlah saya memiliki string seperti:
"Hello how are you doing?"
Saya ingin fungsi yang mengubah banyak spasi menjadi satu spasi.
Jadi saya akan mendapatkan:
"Hello how are you doing?"
Saya tahu saya bisa menggunakan regex atau panggilan
string s = "Hello how are you doing?".replace(" "," ");
Tapi saya harus memanggilnya beberapa kali untuk memastikan semua spasi berurutan diganti hanya dengan satu.
Apakah sudah ada metode bawaan untuk ini?
c#
string
whitespace
Matt
sumber
sumber
Jawaban:
sumber
Pertanyaan ini tidak sesederhana yang dibuat poster lain (dan seperti yang saya yakini semula) - karena pertanyaannya tidak cukup tepat seperti yang seharusnya.
Ada perbedaan antara "spasi" dan "spasi putih". Jika yang Anda maksud hanya spasi, maka Anda harus menggunakan ekspresi reguler
" {2,}"
. Jika yang Anda maksud setiap spasi, itu soal lain. Haruskah semua spasi harus diubah menjadi spasi? Apa yang seharusnya terjadi pada ruang di awal dan akhir?Untuk patokan di bawah, saya berasumsi bahwa Anda hanya peduli dengan spasi, dan Anda tidak ingin melakukan apa pun pada satu spasi, bahkan di awal dan akhir.
Perhatikan bahwa kebenaran hampir selalu lebih penting daripada kinerja. Fakta bahwa solusi Split / Join menghapus spasi di depan / di belakang (bahkan hanya satu spasi) tidak benar sejauh persyaratan yang Anda tentukan (yang mungkin tidak lengkap, tentu saja).
Tolok ukur menggunakan MiniBench .
Beberapa uji coba:
Di sini angka pertama adalah jumlah iterasi, yang kedua adalah waktu yang dibutuhkan, dan yang ketiga adalah skor berskala dengan 1,0 sebagai yang terbaik.
Itu menunjukkan bahwa dalam beberapa kasus (termasuk yang satu ini) ekspresi reguler dapat mengungguli solusi Pisahkan / Gabung, terkadang dengan margin yang sangat signifikan.
Namun, jika Anda mengubah untuk "semua spasi" persyaratan, maka Berpisah / Bergabung tidak muncul untuk menang. Seperti yang sering terjadi, iblis berada dalam detail ...
sumber
Expressoin biasa akan menjadi cara termudah. Jika Anda menulis regex dengan cara yang benar, Anda tidak akan memerlukan banyak panggilan.
Ubah menjadi ini:
sumber
@"\s{2,}"
adalah gagal mengganti tab tunggal dan karakter spasi Unicode lainnya dengan spasi. Jika Anda akan mengganti 2 tab dengan spasi, Anda mungkin harus mengganti 1 tab dengan spasi.@"\s+"
akan melakukannya untukmu.Meskipun jawaban yang ada baik-baik saja, saya ingin menunjukkan satu pendekatan yang tidak berhasil:
Ini bisa berputar selamanya. Ada yang mau menebak kenapa? (Saya baru menemukan ini ketika ditanya sebagai pertanyaan grup berita beberapa tahun yang lalu ... seseorang benar-benar menganggapnya sebagai masalah.)
sumber
Seperti yang telah ditunjukkan, ini mudah dilakukan dengan ekspresi reguler. Saya hanya akan menambahkan bahwa Anda mungkin ingin menambahkan .trim () ke dalamnya untuk menghilangkan spasi kosong di depan / di belakang.
sumber
Inilah Solusi yang saya kerjakan. Tanpa RegEx dan String.Split.
jadi kamu bisa:
sumber
Penghilang spasi ekstra cepat ... Ini yang tercepat dan didasarkan pada salinan di tempat Felipe Machado.
Tolok ukur ...
InPlaceCharArraySpaceOnly oleh Felipe Machado pada CodeProject 2015 dan dimodifikasi oleh Sunsetquest untuk penghapusan multi-ruang. Waktu: 3,75 Kutu
InPlaceCharArray oleh Felipe Machado 2015 dan sedikit dimodifikasi oleh Sunsetquest untuk penghapusan multi-ruang. Waktu 6,50 Ticks (mendukung tab juga)
SplitAndJoinOnSpace oleh Jon Skeet . Waktu: 13.25 Kutu
StringBuilder oleh fubo Waktu: 13.5 Kutu (mendukung tab juga)
Regex dengan kompilasi oleh Jon Skeet . Waktu: 17 Kutu
StringBuilder oleh David S 2013 Waktu: 30.5 Kutu
Regex dengan non-compile oleh Brandon Time: 63.25 Ticks
StringBuilder oleh user214147 Waktu: 77.125 Kutu
Regex dengan Tim Hoolihan non-kompilasi Waktu: 147.25 Kutu
Kode Benchmark ...
}
Catatan benchmark: Mode Rilis, tanpa debugger terpasang, prosesor i7, rata-rata 4 proses, hanya string pendek yang diuji
sumber
Saya membagikan apa yang saya gunakan, karena tampaknya saya telah menemukan sesuatu yang berbeda. Saya telah menggunakan ini untuk sementara waktu dan cukup cepat untuk saya. Saya tidak yakin bagaimana itu bisa dibandingkan dengan yang lain. Saya menggunakannya dalam penulis file yang dibatasi dan menjalankan tabel data besar satu per satu melalui itu.
sumber
Dengan menggunakan program pengujian yang diposting Jon Skeet, saya mencoba melihat apakah saya bisa mendapatkan loop yang ditulis tangan agar berjalan lebih cepat.
Saya bisa mengalahkan NormalizeWithSplitAndJoin setiap saat, tetapi hanya mengalahkan NormalizeWithRegex dengan input 1000, 5.
Saya belum melihat kode mesin yang dihasilkan jitter, namun saya berharap masalahnya adalah waktu yang dibutuhkan oleh panggilan ke StringBuilder.Append () dan untuk melakukan yang lebih baik akan memerlukan penggunaan kode yang tidak aman.
Jadi Regex.Replace () sangat cepat dan sulit dikalahkan !!
sumber
VB.NET
C #
Nikmati kekuatan LINQ = D
sumber
string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
Split
untuk menangkap semua spasi dan menghapusWhere
klausa:myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
sumber
Solusi terkecil:
var regExp = / \ s + / g, newString = oldString.replace (regExp, '');
sumber
Anda bisa mencoba ini:
sumber
Grup pengganti menyediakan pendekatan impler yang menyelesaikan penggantian beberapa karakter spasi dengan satu karakter yang sama :
Harap perhatikan contoh kedua tetap tunggal
\n
sementara jawaban yang diterima akan menggantikan akhir baris dengan spasi.Jika Anda perlu mengganti setiap kombinasi karakter spasi dengan yang pertama, hanya menghapus back-referensi
\k
dari pola.sumber
Menggunakan ekspresi reguler, untuk mengganti 2 atau lebih spasi putih dengan spasi tunggal, juga merupakan solusi yang baik.
Kami menggunakan pola regex sebagai " \ s + ".
\ s cocok dengan spasi, tab, baris baru, carriage return, form feed atau tab vertikal.
'+' mengatakan satu atau lebih kemunculan.
Contoh Regex
sumber
Tidak ada cara bawaan untuk melakukan ini. Anda bisa mencoba ini:
Ini akan menghapus whitespce di depan dan di belakang serta menciutkan spasi internal apa pun menjadi satu karakter spasi. Jika Anda benar-benar hanya ingin menciutkan spasi, solusi yang menggunakan ekspresi reguler lebih baik; jika tidak, solusi ini lebih baik. (Lihat analisis yang dilakukan oleh Jon Skeet.)
sumber
source.ToCharArray()
dan kemudian membuang hasilnya?ToCharArray()
hasil string.Join, hanya untuk membuat string baru ... wow, untuk itu berada di pos mengeluh overhead hanya luar biasa. -1.whitespace
adalahnew char[] { ' ' }
, ini akan memberikan hasil yang salah jika string input dimulai atau diakhiri dengan spasi.