Bagaimana saya bisa mengganti banyak spasi dalam string dengan hanya satu spasi di C #?
Contoh:
1 2 3 4 5
akan menjadi:
1 2 3 4 5
Bagaimana saya bisa mengganti banyak spasi dalam string dengan hanya satu spasi di C #?
Contoh:
1 2 3 4 5
akan menjadi:
1 2 3 4 5
Jawaban:
string sentence = "This is a sentence with multiple spaces";
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
sentence = regex.Replace(sentence, " ");
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.
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Saya pikir jawaban Matt adalah yang terbaik, tetapi saya tidak yakin itu benar. Jika Anda ingin mengganti baris baru, Anda harus menggunakan:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
Jauh lebih sederhana dari semua itu:
while(str.Contains(" ")) str = str.Replace(" ", " ");
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
.
public static class StringExtension
{
public static String ReduceWhitespace(this String value)
{
var newString = new StringBuilder();
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."
myString = Regex.Replace(myString, " {2,}", " ");
Bagi mereka yang tidak suka Regex
, berikut adalah metode yang menggunakan StringBuilder
:
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
StringBuilder stringBuilder = new StringBuilder(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 bisa melakukan ini dalam satu solusi!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
Anda dapat memilih tanda kurung lain (atau bahkan karakter lain) jika suka.
"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
Ini 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.
temp = new Regex(" {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:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
no Regex, no Linq ... menghapus spasi awal dan akhir serta mengurangi beberapa segmen spasi yang disematkan menjadi satu spasi
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
hasil: "0 1 2 3 4 5"
Menghemat jawaban lain, per Joel, dan semoga sedikit membaik saat aku mulai:
Anda dapat melakukan ini dengan Regex.Replace()
:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
Atau dengan String.Split()
:
static class StringExtensions
{
public static string Join(this IList<string> value, string separator)
{
return string.Join(separator, value.ToArray());
}
}
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
Saya baru saja menulis yang baru Join
saya suka, jadi saya pikir saya akan menjawab kembali, dengan itu:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
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 (" ");
// Mysample string
string str ="hi you are a demo";
//Split the words based on white sapce
var 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%.
public static string MergeSpaces(this string str)
{
if (str == null)
{
return null;
}
else
{
StringBuilder stringBuilder = new StringBuilder(str.Length);
int i = 0;
foreach (char c in str)
{
if (c != ' ' || i == 0 || str[i - 1] != ' ')
stringBuilder.Append(c);
i++;
}
return stringBuilder.ToString();
}
}
Saya dapat menghapus spasi putih dengan ini
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
coba metode ini
private string removeNestedWhitespaces(char[] st)
{
StringBuilder sb = new StringBuilder();
int indx = 0, length = st.Length;
while (indx < length)
{
sb.Append(st[indx]);
indx++;
while (indx < length && st[indx] == ' ')
indx++;
if(sb.Length > 1 && sb[0] != ' ')
sb.Append(' ');
}
return sb.ToString();
}
gunakan seperti ini:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
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.
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
var stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (i == 0 || !char.IsWhiteSpace(c) || (char.IsWhiteSpace(c) &&
!char.IsWhiteSpace(strValue[i - 1])))
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
Skool lama:
string oldText = " 1 2 3 4 5 ";
string newText = oldText
.Replace(" ", " " + (char)22 )
.Replace( (char)22 + " ", "" )
.Replace( (char)22 + "", "" );
Assert.That( newText, Is.EqualTo( " 1 2 3 4 5 " ) );
Tanpa menggunakan ekspresi reguler:
while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1)
{
myString = myString.Replace(" ", " ");
}
OK untuk digunakan pada string pendek, tetapi akan berkinerja buruk pada string panjang dengan banyak ruang.
Campuran StringBuilder dan Enumerable.Aggregate () sebagai metode ekstensi untuk string:
using System;
using System.Linq;
using System.Text;
public static class StringExtension
{
public static string StripSpaces(this string s)
{
return s.Aggregate(new StringBuilder(), (acc, c) =>
{
if (c != ' ' || acc.Length > 0 && acc[acc.Length-1] != ' ')
acc.Append(c);
return acc;
}).ToString();
}
public static void Main()
{
Console.WriteLine("\"" + StringExtension.StripSpaces("1 Hello World 2 ") + "\"");
}
}
Memasukkan:
"1 Hello World 2 "
Keluaran:
"1 Hello World 2 "