Java cara mengganti 2 ruang atau lebih dengan spasi tunggal dalam string dan menghapus spasi awal dan akhir

271

Mencari cara cepat dan sederhana di Jawa untuk mengubah string ini

" hello     there   "

untuk sesuatu yang terlihat seperti ini

"hello there"

di mana saya mengganti semua banyak ruang dengan satu ruang, kecuali saya juga ingin satu atau lebih spasi di awal string hilang.

Sesuatu seperti ini membuat saya sebagian di sana

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

tapi tidak cukup.

Nessa
sumber
5
Anda harus mempertimbangkan menerima jawaban. Itu membuat lebih mudah bagi orang-orang yang tiba di halaman nanti untuk memilih solusi yang pasti.
Paul Rooney
1
Ini adalah salah satu cara yang paling direkomendasikan. =>. String nameWithProperSpacing = StringUtils.normalizeSpace (stringWithLotOfSpaces);
Kunal Vohra
s = s.replaceAll ("\\ s +", "");
Saroj Kumar Sahoo

Jawaban:

461

Coba ini:

String after = before.trim().replaceAll(" +", " ");

Lihat juga


Tidak ada trim()regex

Ini juga mungkin dilakukan hanya dengan satu replaceAll, tetapi ini jauh lebih mudah dibaca daripada trim()solusinya. Meskipun demikian, ini disediakan di sini hanya untuk menunjukkan apa yang dapat dilakukan regex:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

Ada 3 alternatif:

  • ^_+ : setiap urutan spasi di awal string
    • Cocokkan dan ganti dengan $1, yang menangkap string kosong
  • _+$ : setiap urutan spasi di akhir string
    • Cocokkan dan ganti dengan $1, yang menangkap string kosong
  • (_)+ : urutan ruang apa pun yang tidak cocok dengan yang di atas, artinya ada di tengah
    • Cocokkan dan ganti dengan $1, yang menangkap satu ruang

Lihat juga

polygenelubricants
sumber
11
+1, terutama karena perlu dicatat bahwa melakukan trim()dan kemudian replaceAll()menggunakan lebih sedikit memori daripada melakukannya sebaliknya. Tidak banyak, tetapi jika ini dipanggil berkali-kali, itu mungkin bertambah, terutama jika ada banyak "ruang kosong dipangkas". ( Trim()tidak benar-benar menghilangkan ruang ekstra - itu hanya menyembunyikannya dengan memindahkan nilai awal dan akhir. Yang mendasarinya char[]tetap tidak berubah.)
corsiKa
2
Ini hanya detail, tapi saya pikir itu ( ) +atau ( ){2,}harus (sangat) sedikit lebih efisien;)
sp00m
6
Regexp bagus. Catatan: mengganti spasi `` dengan \\sakan mengganti grup spasi putih dengan karakter yang diinginkan.
djmj
1
Perhatikan bahwa bagian () + akan cocok dengan satu ruang dan menggantinya dengan satu ruang. Mungkin (<spasi> <spasi> +) akan lebih baik sehingga hanya cocok jika ada beberapa ruang dan penggantian akan membuat perubahan bersih ke string.
Lee Meador
2
Seperti yang disebutkan Lee Meador, .trim().replaceAll(" +", " ")(dengan dua spasi) lebih cepat dari .trim().replaceAll(" +", " ")(dengan satu spasi). Saya menjalankan tes timing pada string yang hanya memiliki ruang tunggal dan semua ruang ganda, dan itu datang jauh lebih cepat untuk keduanya ketika melakukan banyak operasi (jutaan atau lebih, tergantung pada lingkungan).
Gary S. Weaver
154

Anda hanya perlu:

replaceAll("\\s{2,}", " ").trim();

di mana Anda mencocokkan satu atau lebih ruang dan menggantinya dengan satu ruang dan kemudian memangkas spasi putih di awal dan akhir (Anda sebenarnya bisa membalikkan dengan memangkas pertama dan kemudian mencocokkan untuk membuat regex lebih cepat seperti yang ditunjukkan seseorang).

Untuk mengujinya dengan cepat, cobalah:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

dan itu akan kembali:

"hello there"
sarah.ferguson
sumber
3
Saya mungkin akan memotong dulu karena Anda akan menghemat sedikit pekerjaan regex.
Michael
3
@ sarah.ferguson Silakan lepaskan braket akhir ")" yang seharusnya tidak ada di replaceAll pertama. Terima kasih. - Sistem tidak akan membiarkan saya melakukannya! (Tidak kurang dari 6 karakter yang memenuhi syarat untuk diedit ..)
mwarren
2
Perhatikan bahwa ini mengganti satu ruang dengan ruang lain dalam kasus di mana tidak ada banyak ruang bersama. Tidak perlu melakukan penggantian dalam kasus itu meskipun Anda mungkin menginginkannya karena Anda mengganti satu tab dengan satu spasi juga. Alangkah baiknya hanya mengenali beberapa spasi saja.
Lee Meador
2
@geowar dari mana pertanyaan meminta tab maaf? Saya yakin di atas tidak menggantikan simbol ☮ juga dalam hal ini .. dan juga
2
tunggu @geowar kedua. Ini mengganti satu tabel dengan spasi. Saya baru saja mencobanya
user1870400
42

Gunakan metode Apache commons StringUtils.normalizeSpace(String str). Lihat dokumen di sini

Monica Granbois
sumber
Gagasan bagus, tetapi ini menghilangkan
garis-garis
20

Ini bekerja dengan baik untuk saya: sValue = sValue.trim().replaceAll("\\s+", " ");

Dokter
sumber
1
Orang-orang mengedit jawaban saya. Aslinya adalah: sValue = sValue.replaceAll ("\ s +", "") .trim ();
Dokter
2
Diedit karena jawaban awal Anda menghilangkan semua spasi dan bukan itu yang diminta OP
Jose Rui Santos
17
"[ ]{2,}"

Ini akan cocok dengan lebih dari satu ruang.

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

KELUARAN:

hello there
Gitesh Dalal
sumber
13

Untuk menghilangkan spasi di awal dan di akhir String, gunakan String#trim()metode. Dan kemudian gunakan mytext.replaceAll("( )+", " ").

folone
sumber
12

Pertama-tama Anda dapat menggunakan String.trim(), dan kemudian menerapkan perintah ganti regex pada hasilnya.

Eyal Schneider
sumber
10
trim () akan menghapus semua ruang di awal dan akhir string, itu tidak berlaku untuk spasi di antara kata
vuhung3990
10

Kode berikut akan memadatkan spasi putih di antara kata-kata dan menghapusnya di awal dan akhir string

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

Ini akan menampilkan a string with many spaces, a tab and a newline

Perhatikan bahwa karakter yang tidak dapat dicetak termasuk spasi, tab, dan baris baru akan dipadatkan atau dihapus


Untuk informasi lebih lanjut, lihat dokumentasi masing-masing:

xcuipir
sumber
9

Coba yang ini.

Kode sampel

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

KELUARAN

hello there

Pertama itu akan mengganti semua ruang dengan ruang tunggal. Daripada kita harus melakukan trim Stringkarena Mulai dari Stringdan Ujung Stringitu akan menggantikan semua ruang dengan ruang tunggal jika Stringmemiliki ruang di Mulai dari Stringdan Akhir StringJadi kita perlu memotong mereka. Daripada Anda mendapatkan yang Anda inginkan String.

Raj S. Rusia
sumber
4

Anda juga bisa menggunakan lookarounds.

test.replaceAll("^ +| +$|(?<= ) ", "");

ATAU

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )cocok dengan karakter spasi yang diikuti oleh karakter spasi lain. Jadi dalam ruang yang berurutan, itu akan cocok dengan semua ruang kecuali yang terakhir karena tidak diikuti oleh karakter spasi. Ini memberi Anda ruang tunggal untuk ruang berurutan setelah operasi penghapusan.

Contoh:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }
Avinash Raj
sumber
Cara Anda memilikinya, itu akan cocok dengan setiap ruang di depan atau di akhir atau ruang tunggal dengan ruang lain setelahnya. Itu berarti "a .... b" akan cocok 3 kali dan ganti tiga kali. Itu beralih ke semua ruang internal di dalam metode replaceAll (). Mungkin Anda bisa mengubahnya untuk mencocokkan urutan 2 ruang atau lebih sekaligus dan mengurangi iterasi internal.
Lee Meador
Mungkin <spasi> + (? = <spasi>) akan melakukannya.
Lee Meador
4

memangkas()

Menghapus hanya ruang terkemuka & belakang.

Dari Java Doc, "Mengembalikan string yang nilainya string ini, dengan spasi spasi apa pun yang memimpin dan tertinggal dihapus."

System.out.println(" D ev  Dum my ".trim());

"D ev Dum my"

ganti (), replaceAll ()

Mengganti semua string kosong dalam kata,

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

Keluaran:

"DevDummy"

"DevDummy"

"DevDummy"

Catatan: "\ s +" adalah ekspresi reguler yang mirip dengan karakter spasi kosong.

Referensi: https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html

Sameera
sumber
4

Banyak jawaban yang benar telah diberikan sejauh ini dan saya melihat banyak upvotes. Namun, cara yang disebutkan akan berhasil tetapi tidak benar-benar dioptimalkan atau tidak benar-benar terbaca. Baru-baru ini saya menemukan solusi yang disukai setiap pengembang.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

Kamu selesai. Ini solusi yang bisa dibaca.

Kunal Vohra
sumber
3

Di Kotlin akan terlihat seperti ini

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")
Rafael
sumber
2
String str = " hello world"

kurangi spasi terlebih dahulu

str = str.trim().replaceAll(" +", " ");

huruf besar huruf pertama dan huruf kecil semuanya

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();
KhaledMohamedP
sumber
2
mytext = mytext.replaceAll("\\s+"," ");
k sarath
sumber
Jawaban khusus kode tidak disarankan. Silakan klik edit dan tambahkan beberapa kata yang meringkas bagaimana kode Anda menjawab pertanyaan, atau mungkin menjelaskan bagaimana jawaban Anda berbeda dari jawaban sebelumnya. Terima kasih
Nick
1

Ini berhasil untuk saya

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

di mana filter mengikuti fungsi dan memindai adalah string input:

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}
Mr_Hmp
sumber
1
Ini akan menggantikan <spasi> <tab> dengan spasi tetapi tidak <tab> <tab>. Itu masalah kecil, sepertinya.
Lee Meador
1

Anda harus melakukannya seperti ini

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

Letakkan + di dalam kurung bulat.

kiro malak
sumber
1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();
Ajinkya_M
sumber
0

Lihat String.replaceAll.

Gunakan regex "\s"dan gantikan dengan " ".

Lalu gunakan String.trim.

Zak
sumber
1
String baru ("halo di sana") .replaceAll ("\\ s", "+") mengembalikan + halo +++++++ di sana +++ jadi pasti tidak berfungsi ..
sarah.ferguson
1
Cobanew String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s
0

Periksa ini...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

Jika String hanya berisi satu spasi maka ganti () tidak akan ganti,

Jika spasi lebih dari satu, Kemudian ganti () tindakan melakukan dan menghilangkan ruang.

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

Untuk menghitung jumlah spasi dalam sebuah String.

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

Pattern .quote ("?") Mengembalikan String pola literal.

Yash
sumber
0

Metode saya sebelum saya menemukan jawaban kedua menggunakan regex sebagai solusi yang lebih baik. Mungkin seseorang membutuhkan kode ini.

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}
trinity420
sumber
Menarik, tapi ruang putih berarti lebih dari sekadar kosong.
Laur Ivan
@LaurIvan apa maksudmu?
trinity420
entri ini memiliki penjelasan yang bagus tentang apa yang dimaksud \sdengan ekspresi reguler (spasi, tab, baris baru, umpan form).
Laur Ivan
@LaurIvan Tautan Anda rusak tetapi Anda benar. Masalah ini bisa diselesaikan dengan iterasi melalui string input, menghapus setiap karakter non-alfabet, non-numerik dan non-spasi, saya pikir.
trinity420
0

Versi stream, filter spasi dan tab.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
Aris2World
sumber
0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"
alaswer
sumber
0

Metode paling sederhana untuk menghilangkan ruang putih di string.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}
Sandun Susantha
sumber
-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

Solusi di atas adalah algoritma dengan kompleksitas O (n) tanpa menggunakan fungsi java.

devmohd
sumber
-1

Silakan gunakan kode di bawah ini

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}
Piyush
sumber
-1

Halo, maaf atas keterlambatannya! Inilah jawaban terbaik dan paling efisien yang Anda cari:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

Jadi output Anda dari contoh ini adalah: Nama saya kingkon.

Namun metode ini juga akan menghapus "\ n" yang mungkin dimiliki string Anda. Jadi, jika Anda tidak ingin, gunakan saja metode sederhana ini:

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

Dan jika Anda ingin menghapus spasi terkemuka dan tambahan juga cukup tambahkan:

str = str.trim();
kostas poimenidhs
sumber
-1

Saya tahu metode replaceAll jauh lebih mudah tetapi saya ingin memposting ini juga.

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}
esranur
sumber
1
Meskipun ini berhasil, itu jauh dari solusi termudah.
platzhersh
-1

String Tokenizer dapat digunakan

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
Swaran
sumber