Bagaimana cara menghapus spasi putih duplikat dalam string menggunakan Java?

147

Bagaimana menghapus spasi putih duplikat (termasuk tab, baris baru, spasi, dll ...) dalam sebuah string menggunakan Java?

bodoh
sumber

Jawaban:

378

Seperti ini:

yourString = yourString.replaceAll("\\s+", " ");

Sebagai contoh

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

output

lorem ipsum dolor sit.

Apa artinya itu \s+?

\s+adalah ekspresi reguler. \scocok dengan spasi, tab, baris baru, carriage return, umpan form atau tab vertikal, dan +mengatakan "satu atau lebih dari itu". Dengan demikian kode di atas akan menciutkan semua "ruang kosong spasi" lebih lama dari satu karakter, dengan karakter ruang tunggal.


Sumber: Java: Menghapus spasi putih duplikat di string

aioobe
sumber
3
@SuhrobSamiev - String.replaceAll () telah ada di Jawa sejak JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles
3
Saya berharap saya bisa menambahkan lebih dari +1 untuk penjelasan yang luar biasa dari \ s +.
Cyntech
Saya mengerti \s+tetapi apa artinya 2 backslash \\?
saplingPro
2
String literal "\\"mewakili string yang terdiri dari backslash tunggal. Jadi untuk mewakili \s+Anda menulis "\\s+".
aioobe
1
Apakah ini akan menghapus carriage kembali? atau haruskah saya menghapus "\\ r" secara terpisah? Terima kasih!
user3388884
24

Anda bisa menggunakan regex

(\s)\1

dan

gantikan dengan $1.

Kode Java:

str = str.replaceAll("(\\s)\\1","$1");

Jika inputnya "foo\t\tbar "Anda akan mendapatkan "foo\tbar "sebagai output
Tetapi jika input "foo\t bar"itu akan tetap tidak berubah karena tidak memiliki karakter spasi spasi berturut-turut.

Jika Anda memperlakukan semua karakter spasi (spasi, tab vertikal, horisontal tab, carriage return, bentuk pakan, baris baru) sebagai ruang maka Anda dapat menggunakan regex berikut untuk mengganti setiap jumlah ruang putih berturut-turut dengan satu ruang:

str = str.replaceAll("\\s+"," ");

Tetapi jika Anda ingin mengganti dua spasi putih berturut-turut dengan satu ruang yang harus Anda lakukan:

str = str.replaceAll("\\s{2}"," ");
codaddict
sumber
9

Coba ini - Anda harus import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

Di mana stringstring Anda di mana Anda perlu menghapus duplikat spasi putih

Sachin Shanbhag
sumber
9

hai tercepat (tapi bukan cara tercantik) yang saya temukan adalah

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

ini berjalan cukup cepat di android berlawanan dengan regex

wutzebaer
sumber
1
Hanya berfungsi untuk spasi tetapi tidak untuk ruang putih lain seperti tab dan baris baru.
Pang
1
saya tahu, Anda harus menambahkan lebih dari ini sementara loop untuk entitas lain. Tetapi kode ini berjalan lebih cepat di android karena regex ini, saya harus memproses ebook lengkap.
wutzebaer
Sangat cepat di desktop juga. Belum mengujinya untuk string besar, tetapi jika Anda berencana menjalankannya pada banyak string kecil ini adalah jawaban yang Anda cari.
Ivelate
9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
oleg.cherednik
sumber
6

Meskipun sudah terlambat, saya telah menemukan solusi yang lebih baik (yang bekerja untuk saya) yang akan menggantikan semua spasi putih yang sama berturut-turut dengan satu spasi putih dari tipenya. Itu adalah:

   Hello!\n\n\nMy    World  

akan

 Hello!\nMy World 

Perhatikan masih ada ruang putih utama dan tertinggal. Jadi solusi lengkap saya adalah:

str = str.trim().replaceAll("(\\s)+", "$1"));

Di sini, trim()ganti semua string ruang putih terkemuka dan tertinggal dengan "". (\\s)untuk menangkap \\s(yaitu spasi putih seperti '', '\ n', '\ t') di grup # 1 . +tanda untuk mencocokkan 1 atau lebih token sebelumnya. Jadi (\\s)+dapat berupa karakter berurutan (1 atau lebih) di antara karakter spasi putih tunggal ('', '\ n' atau '\ t'). $1adalah untuk mengganti string yang cocok dengan string grup # 1 (yang hanya berisi 1 karakter spasi putih) dari jenis yang cocok (yaitu karakter spasi tunggal putih yang telah cocok). Solusi di atas akan berubah seperti ini:

   Hello!\n\n\nMy    World  

akan

Hello!\nMy World

Saya belum menemukan solusi di atas di sini jadi saya telah mempostingnya.

arnobpl
sumber
0

Jika Anda ingin menyingkirkan semua spasi putih asing yang mengarah dan tertinggal maka Anda ingin melakukan sesuatu seperti ini:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

Kemudian Anda dapat menghapus duplikat menggunakan strategi lain yang tercantum di sini:

string = string.replaceAll("\\s+"," ");
jonnysamps
sumber
0

Anda juga dapat mencoba menggunakan Tokeniser Tali, untuk ruang, tab, baris baru, dan semua. Cara sederhana adalah,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}
imvp
sumber
-10

Ini dapat dimungkinkan dalam tiga langkah:

  1. Ubah string menjadi array karakter (ToCharArray)
  2. Terapkan untuk loop pada array charater
  3. Kemudian terapkan fungsi ganti string (Ganti ("sengat yang ingin Anda ganti", "string asli"));
Dheeraj di Techreuters
sumber
1
Itu bukan solusi yang baik, menjatuhkan ke array char tidak menyelesaikan apa pun. Anda sebenarnya tidak menjelaskan bagaimana cara mengganti, yang merupakan inti masalahnya. Juga tolong jangan memposting tautan yang sama sekali tidak terkait. Anda akan ditandai sebagai spammer jika melakukannya.
Mat