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.


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


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"

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


20

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


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

13

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


12

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


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:


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.


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("^ +| +$| (?= )", "")
            );
        }

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


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.


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)+"), " ")

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();

2
mytext = mytext.replaceAll("\\s+"," ");

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();
}

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.


1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();

0

Lihat String.replaceAll.

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

Lalu gunakan String.trim.


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.


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();
}

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(" "))

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

0

Metode paling sederhana untuk menghilangkan ruang putih di string.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}

-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.


-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());
    }
}

-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();

-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;
}

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());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.