mesin negara dapat dengan mudah melakukannya, tetapi mungkin berlebihan jika Anda hanya perlu menghapus spasi
Adrian
Saya telah menambahkan patokan pada berbagai cara untuk melakukan ini dalam pertanyaan duplikat stackoverflow.com/a/37592018/582061 . Regex bukan cara tercepat untuk melakukan ini.
Stian Standahl
Jawaban:
469
string sentence ="This is a sentence with multiple spaces";RegexOptions options =RegexOptions.None;Regex regex =newRegex("[ ]{2,}", options);
sentence = regex.Replace(sentence," ");
Saya telah menyalin dan menempelnya dan berfungsi. Saya benar-benar tidak suka REgex tetapi kali ini menyelamatkan hidup saya.
Pokus
9
@Craig komentar sudah cukup, IMO. // Blok ini menggantikan beberapa spasi dengan satu ... :)
paulwhit
6
Sungguh, RegEx berlebihan untuk ini.
Joel Coehoorn
11
@ Joel: Tidak setuju. Saya sebenarnya yakin bahwa cara ini lebih efisien daripada milik Anda untuk string yang cukup besar dan dapat dilakukan dalam satu baris. Di mana berlebihannya?
Konrad Rudolph
24
@Oscar Joel's code bukan loop sederhana melalui semua karakter! Ini adalah loop bersarang tersembunyi yang memiliki kasus terburuk kuadratik. Ekspresi reguler ini, sebaliknya, adalah linier, hanya membangun satu string (= mengurangi biaya alokasi secara drastis dibandingkan dengan kode Joel) dan lebih jauh lagi mesin dapat mengoptimalkannya (jujur saja, saya ragu. NET regex adalah cukup pintar untuk ini tetapi secara teori ungkapan reguler ini dapat diimplementasikan dengan sangat murah sehingga tidak lucu lagi; hanya membutuhkan DFA dengan tiga negara, masing-masing satu transisi, dan tidak ada informasi tambahan).
Konrad Rudolph
624
Saya suka menggunakan:
myString =Regex.Replace(myString,@"\s+"," ");
Karena itu akan menangkap run dari segala jenis spasi putih (misalnya tab, baris baru, dll) dan menggantinya dengan satu spasi.
Modifikasi sedikit: Regex.Replace (sumber, @ "(\ s) \ s +", "$ 1"); Ini akan mengembalikan tipe spasi putih pertama yang ditemukan. Jadi jika Anda memiliki 5 tab, itu akan mengembalikan satu tab. Memetikan seseorang lebih suka ini.
FB ten Kate
@radistao Tautan Anda untuk penggantian string Javascript, bukan untuk C #.
Shiva
1
@Shiva, / \ s + s + / adalah pernyataan regex POSIX standar dan dapat dikonversi / digunakan dalam bahasa apa pun menggunakan sintaksis sendiri
radistao
4
Dalam semangat solusi @ FBtenKate: Regex.Replace (sumber, @ "(\ s) \ 1+", "$ 1"); akan mengganti beberapa karakter berurutan yang identik dengan satu karakter.
François Beaune
1
untuk menghapus spasi putih depan dan akhir, Anda harus menggunakan fungsi Trim () dengan ini ,, seperti var myString = Regex.Replace (myString, @ "\ s +", "") .Trim ();
Ini lebih mudah dibaca daripada regex, saya lebih suka itu karena saya tidak perlu belajar beberapa sintaks lainnya
Michael Bahig
9
Saya menyukainya karena tidak perlu Regex
AleX_
3
Ini tidak efisien untuk string besar.
DarcyThomas
3
Ini juga menghilangkan ruang depan dan belakang.
Matzi
1
Saya lebih suka jawaban ini juga. Mentor lama saya dulu mengatakan "kapan saja Anda memiliki masalah, Anda pikir Anda perlu Regex untuk menyelesaikannya, yah ... sekarang Anda punya dua masalah" <wink>
William Madonna Jr
38
Saya pikir jawaban Matt adalah yang terbaik, tetapi saya tidak yakin itu benar. Jika Anda ingin mengganti baris baru, Anda harus menggunakan:
RegexOptions.Multiline mengubah arti ^ dan $ sehingga cocok dengan awal dan akhir setiap baris ($ = \ n), bukan seluruh string multi-line. Karena \ s setara dengan [\ f \ n \ r \ t \ v] baris baru harus diganti bahkan jika opsi Multiline tidak aktif.
SushiGuy
1
Jawaban Matt sudah mencakup ini. Saya 'yakin' 30 orang baru saja menutup mata memilih jawaban ini :)
Ini akan jauh lebih efisien daripada regex "{2,}" jika string berisi urutan 3 ruang atau lebih.
Jan Goyvaerts
2
@ JanGoyvaerts: Bahkan dengan 10 spasi, regex lebih lambat ketika saya melakukan tes cepat dan kotor. Yang sedang berkata, hanya membutuhkan satu substring raksasa penuh ruang untuk benar-benar membunuh kinerja dari loop sementara. Untuk keadilan, saya menggunakan saya menggunakan RegexOptions. Dikompilasi, bukan Regex yang lebih lambat. Ganti.
Brian
5
RegexOptions.Compiled menambahkan banyak overhead yang mengkompilasi regex ke IL. Jangan menggunakannya kecuali aplikasi Anda akan menggunakan regex cukup sering atau pada string yang cukup besar sehingga peningkatan kecepatan pencocokan mengimbangi penurunan kecepatan kompilasi.
Jan Goyvaerts
Ini adalah contoh kode tidak efisien yang ekstrem. LOL.
pcbabu
1
@ pcbabu Tidak seburuk yang terlihat pada banyak kasus. The Replace()Metode akan menangani semua kejadian dari dua ruang di suatu string, jadi kita tidak looping (dan re-mengalokasikan seluruh string) untuk setiap contoh dari ruang dipasangkan dalam string. Satu alokasi baru akan menangani semuanya. Kami hanya menjalankan kembali loop ketika ada 3 ruang atau lebih secara bersamaan, yang kemungkinan akan lebih jarang terjadi pada banyak sumber input. Jika Anda bisa menunjukkannya menjadi masalah bagi data Anda, maka tulis mesin negara untuk mendorong karakter demi karakter ke pembuat string baru.
Joel Coehoorn
21
Regex bisa agak lambat bahkan dengan tugas-tugas sederhana. Ini menciptakan metode ekstensi yang dapat digunakan dari apa pun string.
publicstaticclassStringExtension{publicstaticStringReduceWhitespace(thisStringvalue){var newString =newStringBuilder();bool previousIsWhitespace =false;for(int i =0; i <value.Length; i++){if(Char.IsWhiteSpace(value[i])){if(previousIsWhitespace){continue;}
previousIsWhitespace =true;}else{
previousIsWhitespace =false;}
newString.Append(value[i]);}return newString.ToString();}}
Ini akan digunakan seperti itu:
string testValue ="This contains too much whitespace."
testValue = testValue.ReduceWhitespace();// testValue = "This contains too much whitespace."
Bagi mereka yang tidak suka Regex, berikut adalah metode yang menggunakan StringBuilder:
publicstaticstringFilterWhiteSpaces(string input){if(input ==null)returnstring.Empty;StringBuilder stringBuilder =newStringBuilder(input.Length);for(int i =0; i < input.Length; i++){char c = input[i];if(i ==0|| c !=' '||(c ==' '&& input[i -1]!=' '))
stringBuilder.Append(c);}return stringBuilder.ToString();}
Dalam pengujian saya, metode ini rata-rata 16 kali lebih cepat dengan set string berukuran kecil hingga sedang yang sangat besar, dibandingkan dengan Regex yang dikompilasi statis. Dibandingkan dengan Regex yang tidak dikompilasi atau non-statis, ini harus lebih cepat.
Perlu diingat, bahwa itu tidak menghilangkan ruang depan atau belakang, hanya beberapa kejadian seperti itu.
Anda harus memastikan string Anda tidak memiliki "()" atau ") (" di dalamnya. Atau "wel()come to london)("menjadi "wel come to london". Anda bisa mencoba menggunakan banyak tanda kurung. Jadi gunakan ((((()))))sebagai ganti ()dan )))))(((((alih-alih )(. Itu masih akan berfungsi. Namun, jika string berisi ((((()))))atau )))))(((((, ini akan gagal
nmit026
7
Ini adalah versi yang lebih pendek, yang seharusnya hanya digunakan jika Anda hanya melakukan ini sekali saja, karena ini akan membuat instance Regexkelas baru setiap kali dipanggil.
temp =newRegex(" {2,}").Replace(temp," ");
Jika Anda tidak terlalu mengenal ekspresi reguler, inilah penjelasan singkat:
The {2,}membuat regex mencari karakter yang mendahuluinya, dan menemukan substring antara 2 dan kali tidak terbatas.
The .Replace(temp, " ")menggantikan semua pertandingan di temp string dengan spasi.
Jika Anda ingin menggunakan ini berkali-kali, ini adalah opsi yang lebih baik, karena ini menciptakan regex IL pada waktu kompilasi:
Kata hati-hati: Penggunaan split, meskipun sangat sederhana untuk dipahami, dapat memiliki dampak kinerja yang sangat negatif. Karena banyak string dapat dibuat, Anda harus mengawasi penggunaan memori Anda jika Anda menangani string besar dengan metode ini.
Pac0
5
Menghemat jawaban lain, per Joel, dan semoga sedikit membaik saat aku mulai:
Salah satu hal keren tentang ini adalah ia bekerja dengan koleksi yang bukan string, dengan memanggil ToString () pada elemen. Penggunaannya masih sama:
//...string s =" 1 2 4 5".Split(" ".ToCharArray(),StringSplitOptions.RemoveEmptyEntries).Join(" ");
mengapa membuat metode ekstensi? mengapa tidak menggunakan string.Join ()?
Eric Schoonover
3
// Mysample stringstring str ="hi you are a demo";//Split the words based on white sapcevar demo= str .Split(' ').Where(s =>!string.IsNullOrWhiteSpace(s));//Join the values back and add a single space in between
str =string.Join(" ", demo);//output: string str ="hi you are a demo";
Saya tahu ini cukup tua, tetapi berlari melintasi ini sambil mencoba untuk mencapai hal yang hampir sama. Menemukan solusi ini di RegEx Buddy. Pola ini akan menggantikan semua ruang ganda dengan ruang tunggal dan juga memangkas ruang depan dan belakang.
pattern:(?m:^+|+$|(){2,})
replacement: $1
Agak sulit dibaca karena kita berhadapan dengan ruang kosong, jadi ini dia lagi dengan "spasi" diganti dengan "_".
pattern:(?m:^_+|_+$|(_){2,})<-- don't use this, just for illustration.
Konstruk "(? M:" memungkinkan opsi "multi-line". Saya biasanya ingin memasukkan opsi apa pun yang saya dapat di dalam pola itu sendiri sehingga lebih mandiri.
Banyak jawaban memberikan output yang tepat tetapi bagi mereka yang mencari kinerja terbaik, saya memang meningkatkan jawaban Nolanar (yang merupakan jawaban terbaik untuk kinerja) sekitar 10%.
publicstaticstringMergeSpaces(thisstring str){if(str ==null){returnnull;}else{StringBuilder stringBuilder =newStringBuilder(str.Length);int i =0;foreach(char c in str){if(c !=' '|| i ==0|| str[i -1]!=' ')
stringBuilder.Append(c);
i++;}return stringBuilder.ToString();}}
while word.contains(" ")//double space
word = word.Replace(" "," ");//replace double space by single space.
word = word.trim();//to remove single whitespces from start & end.
maaf atas kesalahannya, saya memperbaiki kodenya, sekarang ini berfungsi seperti yang diharapkan string yang diuji: "1 2 3 4 9" string hasil: "1 2 3 4 9"
using System;
using System.Linq;
using System.Text;publicstaticclassStringExtension{publicstaticstringStripSpaces(thisstring s){return s.Aggregate(newStringBuilder(),(acc, c)=>{if(c !=' '|| acc.Length>0&& acc[acc.Length-1]!=' ')
acc.Append(c);return acc;}).ToString();}publicstaticvoidMain(){Console.WriteLine("\""+StringExtension.StripSpaces("1 Hello World 2 ")+"\"");}}
Jawaban:
sumber
Saya suka menggunakan:
Karena itu akan menangkap run dari segala jenis spasi putih (misalnya tab, baris baru, dll) dan menggantinya dengan satu spasi.
sumber
sumber
Saya pikir jawaban Matt adalah yang terbaik, tetapi saya tidak yakin itu benar. Jika Anda ingin mengganti baris baru, Anda harus menggunakan:
sumber
Pendekatan lain yang menggunakan LINQ:
sumber
Jauh lebih sederhana dari semua itu:
sumber
Replace()
Metode akan menangani semua kejadian dari dua ruang di suatu string, jadi kita tidak looping (dan re-mengalokasikan seluruh string) untuk setiap contoh dari ruang dipasangkan dalam string. Satu alokasi baru akan menangani semuanya. Kami hanya menjalankan kembali loop ketika ada 3 ruang atau lebih secara bersamaan, yang kemungkinan akan lebih jarang terjadi pada banyak sumber input. Jika Anda bisa menunjukkannya menjadi masalah bagi data Anda, maka tulis mesin negara untuk mendorong karakter demi karakter ke pembuat string baru.Regex bisa agak lambat bahkan dengan tugas-tugas sederhana. Ini menciptakan metode ekstensi yang dapat digunakan dari apa pun
string
.Ini akan digunakan seperti itu:
sumber
sumber
Bagi mereka yang tidak suka
Regex
, berikut adalah metode yang menggunakanStringBuilder
:Dalam pengujian saya, metode ini rata-rata 16 kali lebih cepat dengan set string berukuran kecil hingga sedang yang sangat besar, dibandingkan dengan Regex yang dikompilasi statis. Dibandingkan dengan Regex yang tidak dikompilasi atau non-statis, ini harus lebih cepat.
Perlu diingat, bahwa itu tidak menghilangkan ruang depan atau belakang, hanya beberapa kejadian seperti itu.
sumber
Anda bisa melakukan ini dalam satu solusi!
Anda dapat memilih tanda kurung lain (atau bahkan karakter lain) jika suka.
sumber
"wel()come to london)("
menjadi"wel come to london"
. Anda bisa mencoba menggunakan banyak tanda kurung. Jadi gunakan((((()))))
sebagai ganti()
dan)))))(((((
alih-alih)(
. Itu masih akan berfungsi. Namun, jika string berisi((((()))))
atau)))))(((((
, ini akan gagalIni adalah versi yang lebih pendek, yang seharusnya hanya digunakan jika Anda hanya melakukan ini sekali saja, karena ini akan membuat instance
Regex
kelas baru setiap kali dipanggil.Jika Anda tidak terlalu mengenal ekspresi reguler, inilah penjelasan singkat:
The
{2,}
membuat regex mencari karakter yang mendahuluinya, dan menemukan substring antara 2 dan kali tidak terbatas.The
.Replace(temp, " ")
menggantikan semua pertandingan di temp string dengan spasi.Jika Anda ingin menggunakan ini berkali-kali, ini adalah opsi yang lebih baik, karena ini menciptakan regex IL pada waktu kompilasi:
sumber
no Regex, no Linq ... menghapus spasi awal dan akhir serta mengurangi beberapa segmen spasi yang disematkan menjadi satu spasi
hasil: "0 1 2 3 4 5"
sumber
Menghemat jawaban lain, per Joel, dan semoga sedikit membaik saat aku mulai:
Anda dapat melakukan ini dengan
Regex.Replace()
:Atau dengan
String.Split()
:sumber
Saya baru saja menulis yang baru
Join
saya suka, jadi saya pikir saya akan menjawab kembali, dengan itu:Salah satu hal keren tentang ini adalah ia bekerja dengan koleksi yang bukan string, dengan memanggil ToString () pada elemen. Penggunaannya masih sama:
sumber
sumber
Saya tahu ini cukup tua, tetapi berlari melintasi ini sambil mencoba untuk mencapai hal yang hampir sama. Menemukan solusi ini di RegEx Buddy. Pola ini akan menggantikan semua ruang ganda dengan ruang tunggal dan juga memangkas ruang depan dan belakang.
Agak sulit dibaca karena kita berhadapan dengan ruang kosong, jadi ini dia lagi dengan "spasi" diganti dengan "_".
Konstruk "(? M:" memungkinkan opsi "multi-line". Saya biasanya ingin memasukkan opsi apa pun yang saya dapat di dalam pola itu sendiri sehingga lebih mandiri.
sumber
Banyak jawaban memberikan output yang tepat tetapi bagi mereka yang mencari kinerja terbaik, saya memang meningkatkan jawaban Nolanar (yang merupakan jawaban terbaik untuk kinerja) sekitar 10%.
sumber
Saya dapat menghapus spasi putih dengan ini
sumber
Gunakan pola regex
sumber
coba metode ini
gunakan seperti ini:
sumber
Berikut ini sedikit modifikasi pada jawaban asli Nolonar .
Memeriksa apakah karakternya bukan hanya spasi, tetapi spasi apa pun, gunakan ini:
Ini akan menggantikan beberapa karakter spasi putih dengan satu spasi.
sumber
Skool lama:
sumber
Tanpa menggunakan ekspresi reguler:
OK untuk digunakan pada string pendek, tetapi akan berkinerja buruk pada string panjang dengan banyak ruang.
sumber
Campuran StringBuilder dan Enumerable.Aggregate () sebagai metode ekstensi untuk string:
Memasukkan:
Keluaran:
sumber