Rimozione di spazi bianchi dalle stringhe in Java


684

Ho una stringa come questa:

mysz = "name=john age=13 year=2001";

Voglio rimuovere gli spazi bianchi nella stringa. Ho provato trim()ma questo rimuove solo gli spazi bianchi prima e dopo l'intera stringa. Ho anche provato, replaceAll("\\W", "")ma poi =viene rimosso anche.

Come posso ottenere una stringa con:

mysz2 = "name=johnage=13year=2001"

1
\\Wsignifica tutte le non parole vedi download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant

76
Qual è il tuo piano con la stringa "name = johnage = 13year = 2001"? Spero di non analizzarlo.
Jonas Elfström,

4
@ JonasElfström Immagino che possa essere d'aiuto nei confronti delle stringhe
Isaac l'

che ne dici se la stringa è effettivamente = "". Tutto ciò che fa trims () è cancellare la stringa vuota proprio come ho detto? @zyamat?
Gumuruh,

Risposte:


1289

st.replaceAll("\\s+","")rimuove tutti gli spazi bianchi e i caratteri non visibili (ad es., tab, \n).


st.replaceAll("\\s+","")e st.replaceAll("\\s","")produce lo stesso risultato.

Il secondo regex è più veloce del 20% rispetto al primo, ma all'aumentare del numero di spazi consecutivi, il primo si comporta meglio del secondo.


Assegna il valore a una variabile, se non utilizzato direttamente:

st = st.replaceAll("\\s+","")

34
Vorrei notare che questi due regex produrranno risultati diversi se stai cercando di sostituire tutti gli spazi bianchi con un singolo spazio (o qualche altro set di caratteri). Se hai spazi consecutivi, usando \\ s sostituirà ogni carattere di spazio bianco con i caratteri forniti. Dato \\ s + sostituirà ogni set di spazi bianchi con una singola stringa di sostituzione. Riesco a vedere alcuni casi in cui le persone potrebbero venire a questo post per sostituire gli spazi bianchi con qualcosa che non è solo una stringa vuota, e questo può essere utile.
Caitlin,

2
ma non rimuove lo spazio bianco se si trova all'inizio della stringa.
solitario

@lonesome use .trim () for that
CQM

6
Usa StringUtils di apache-commons. È un metodo statico chiamato StringUtils.deleteWhitespace.
Crozeta,

@Gursel grazie per la risposta e il confronto delle prestazioni per due regex. Mi chiedevo perché ci sia una differenza di prestazioni tra due? C'è qualcosa che mi manca, potresti indicarmi qualsiasi riferimento che parli di più della differenza di prestazioni.
Vishrant,

248
replaceAll("\\s","")

\w = Tutto ciò che è un carattere parola

\W = Tutto ciò che non è un carattere di parola (inclusa punteggiatura ecc.)

\s = Tutto ciò che è un carattere spazio (inclusi spazio, caratteri di tabulazione ecc.)

\S = Tutto ciò che non è un carattere spaziale (inclusi sia lettere che numeri, nonché punteggiatura ecc.)

(Modifica: come sottolineato, è necessario sfuggire alla barra rovesciata se si desidera \sraggiungere il motore regex, risultante \\s.)


103

La risposta più corretta alla domanda è:

String mysz2 = mysz.replaceAll("\\s","");

Ho appena adattato questo codice dalle altre risposte. Lo sto postando perché oltre ad essere esattamente quello che la domanda ha richiesto, dimostra anche che il risultato viene restituito come una nuova stringa, la stringa originale non viene modificata come alcune delle risposte implicano.

(Gli sviluppatori Java esperti potrebbero dire "ovviamente, non puoi effettivamente modificare una stringa", ma il pubblico di destinazione per questa domanda potrebbe non saperlo.)


Questo significa che possiamo sovrascrivere la stringa originale scrivendo ad esempio: S = S.replaceAll ("\\ s", ""); mentre prima verrà effettuata la sostituzione e poi S riceverà la versione
sverniciata

@frogeyedpeas Che sovrascrive la variabile Sma non sovrascrive la stringa a cui Spunta.
Ripristina Monica il

Mi hai salvato la giornata! ;)
Paras Jain,


45

Un modo per gestire le manipolazioni di String è StringUtils dai beni comuni di Apache.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Puoi trovarlo qui . commons-lang include molto di più ed è ben supportato.


Questo ha il vantaggio di essere più leggibile.
Payne

36

Se è necessario rimuovere anche spazi indistruttibili, è possibile aggiornare il codice in questo modo:

st.replaceAll("[\\s|\\u00A0]+", "");

Questo fallisce per: " ab c "
Mohd Farid,

1
@MohdFarid Ha applicato una correzione, ora va bene.
Denis Kulagin,

Penso che dovrebbe essere st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk,


25

Hai già ricevuto la risposta corretta da Gursel Koca ma credo che ci siano buone probabilità che questo non sia ciò che vuoi davvero fare. Che ne dici di analizzare i valori-chiave invece?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

output:
nome = john
age = 13
year = 2001


22

Dovresti usare

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

invece di:

s.replaceAll("\\s", "");

In questo modo, funzionerà con più di uno spazio tra ogni stringa. Il segno + nella regex sopra significa "uno o più \ s"


2
Ho scritto un breve esempio per verificarlo perché mi è sembrato strano e ho scoperto che il segno più aggiunto non era necessario. Vengono consumati più spazi che separano le parole. È molto probabile che ciò si replaceAllripeta fino a quando il modello non corrisponde a nessuna parte della stringa.
nyaray,

2
Infatti. Il +possono rendere leggermente più CPU amichevole, perché gli spazi bianchi consecutivi viene gestito in una sola sostituzione operazione, ma questa è l'unica differenza in questo caso. È in effetti lo spazio All, non quello +che sta sostituendo gli spazi bianchi non consecutivi nella stringa.
nitro2k01,

non lo elimina (u00A0)
Kerim FIRAT

8

Il modo più semplice per farlo è usare la org.apache.commons.lang3.StringUtilsclasse di commons-lang3libreria come " commons-lang3-3.1.jar" per esempio.

Usa il metodo statico " StringUtils.deleteWhitespace(String str)" sulla tua stringa di input e ti restituirà una stringa dopo aver rimosso tutti gli spazi bianchi da essa. Ho provato la tua stringa di esempio " name=john age=13 year=2001" e mi ha restituito esattamente la stringa che volevi - " name=johnage=13year=2001". Spero che sia di aiuto.


7

Puoi farlo così semplicemente

String newMysz = mysz.replace(" ","");

Sorprendentemente, l'unico lavoratore nella mia situazione. Grazie.
Valeriy,

6
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// funziona bene con qualsiasi spazio * non dimenticare lo spazio nella puntura b


Molto utile, ma non risponde alla domanda postata!
BuvinJ,

3

\Wsignifica "carattere non verbale". Il modello per i caratteri degli spazi bianchi è \s. Questo è ben documentato nel modello javadoc .


8
Dov'è il resto di questa risposta?
LS

3

In java possiamo eseguire le seguenti operazioni:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

per questo è necessario importare i seguenti pacchetti nel programma:

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

spero che ti possa aiutare.


Queste informazioni sono state fornite da altri anni prima di pubblicare la risposta.
Jan Groth,

3

Usando Pattern And Matcher è più dinamico.

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

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}


3

Utilizzare la stringa util della classe apache è meglio per evitare NullPointerException

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

Produzione

abcdef

3

Quando si utilizza st.replaceAll("\\s+","")in Kotlin , assicurarsi di avvolgere "\\s+"con Regex :

"myString".replace(Regex("\\s+"), "")

2
mysz = mysz.replace(" ","");

Primo con spazio, secondo senza spazio.

Quindi è fatto.


7
Giusto per chiarire, lo spazio bianco significa [ \t\n\x0B\f\r]. Stai solo facendo [ ]spazi normali .
GKFX,

2
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}


1

Per rimuovere gli spazi nell'esempio, questo è un altro modo per farlo:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

Ciò che fa è che lo converte in un array con gli spazi che sono i separatori e quindi combina gli elementi nell'array senza gli spazi.

Funziona abbastanza bene ed è facile da capire.


2
Ma una soluzione molto inefficiente. E, come puoi vedere dalle altre soluzioni, questo funziona solo per "" lo spazio - e non per diversi tipi di spazi bianchi.
GhostCat

1

Ci sono anche altri caratteri spaziali nelle stringhe. Quindi potrebbe essere necessario sostituire i caratteri spaziali dalle stringhe.

Esempio: SPAZIO DI NO-BREAK, SPAZIO TRE PER EM, SPAZIO DI PUNTAZIONE

Ecco l'elenco dei caratteri spaziali http://jkorpela.fi/chars/spaces.html

Quindi dobbiamo modificare

<4 per noi SPAZIO TRE PER EM

s.replaceAll ( "[\ u0020 \ u2004]", "")


0

Lo spazio bianco può essere rimosso utilizzando la funzione isWhitespace dalla classe di caratteri.

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

0

Separare ciascun gruppo di testo nella propria sottostringa e quindi concatenare tali sottostringhe:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

0
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

Questo potrebbe aiutare.


0

Puoi anche dare un'occhiata al codice Java qui sotto. I seguenti codici non usano alcun metodo "incorporato".

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

Ingresso:

String inp = "01239Debashish123Pattn456aik";

Produzione:

The String is: 01239123456

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

0

Vengono fornite molte risposte. Vorrei dare una soluzione che sia abbastanza leggibile e migliore di regex.

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

    public static void main(String[] args) throws IOException {

        String str1 = "\n\tThis is my string \n \r\n  !";

        System.out.println("[" + str1 + "]");

        System.out.println("Whitespace Removed:");

        System.out.println("[" + StringUtils.deleteWhitespace(str1) + "]");

        System.out.println();

    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.