Come rimuovere gli spazi bianchi duplicati nella stringa usando Java?


147

Come rimuovere gli spazi bianchi duplicati (incluse le schede, le nuove righe, gli spazi, ecc ...) in una stringa usando Java?

Risposte:


378

Come questo:

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

Per esempio

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

uscite

lorem ipsum dolor sit.

Che cosa \s+significa?

\s+è un'espressione regolare. \scorrisponde a uno spazio, scheda, nuova riga, ritorno a capo, avanzamento modulo o scheda verticale e +indica "uno o più di questi". Pertanto, il codice precedente comprime tutte le "sottostringhe di spazi bianchi" più lunghe di un carattere, con un singolo carattere di spazio.


Fonte: Java: rimozione di spazi bianchi duplicati nelle stringhe


3
@SuhrobSamiev - String.replaceAll () è stato in Java dal JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles,

3
Vorrei poter aggiungere più di +1 per la fantastica spiegazione di \ s +.
Cyntech,

Ho capito \s+ma cosa significa 2 barra rovesciata \\?
saplingPro

2
Il valore letterale stringa "\\"rappresenta la stringa costituita da una singola barra rovesciata. Quindi per rappresentarti \s+scrivi "\\s+".
aioobe,

1
Questo rimuoverà il ritorno a capo? o dovrei rimuovere "\\ r" separatamente? Grazie!
user3388884

24

Puoi usare la regex

(\s)\1

e

sostituirlo con $1.

Codice Java:

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

Se l'input è "foo\t\tbar ", otterrai "foo\tbar "come output,
ma se l'input è "foo\t bar", rimarrà invariato perché non ha caratteri spazi bianchi consecutivi.

Se trattate tutti i caratteri degli spazi bianchi (spazio, scheda verticale, scheda orizzontale, ritorno a capo, avanzamento modulo, nuova riga) come spazio, potete utilizzare la seguente regex per sostituire qualsiasi numero di spazio bianco consecutivo con un singolo spazio:

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

Ma se vuoi sostituire due spazi bianchi consecutivi con uno spazio singolo dovresti fare:

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

9

Prova questo: devi farlo import java.util.regex.*;

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

Dov'è la stringtua stringa su cui devi rimuovere gli spazi bianchi duplicati


9

ciao il modo più veloce (ma non più grazioso) che ho trovato è

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

questo funziona abbastanza velocemente su Android al contrario di una regex


1
Funziona solo per gli spazi ma non per altri spazi bianchi come schede e newline.
Pang

1
lo so, devi aggiungere più di questi mentre loop per altre entità. Ma questo codice funziona molto più velocemente su Android poiché questi regex, ho dovuto elaborare ebooks completi.
wutzebaer,

Enormemente più veloce anche sul desktop. Non l'ho testato per una stringa grande, ma se hai intenzione di eseguirlo su molte stringhe piccole questa è la risposta che stai cercando.
Ivelate il

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

Anche se è troppo tardi, ho trovato una soluzione migliore (che funziona per me) che sostituirà tutti gli spazi bianchi consecutivi dello stesso tipo con uno spazio bianco del suo tipo. Questo è:

   Hello!\n\n\nMy    World  

sarà

 Hello!\nMy World 

Si noti che ci sono ancora spazi bianchi iniziali e finali. Quindi la mia soluzione completa è:

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

Qui, trim()sostituisce tutte le stringhe di spazi bianchi iniziali e finali con "". (\\s)serve per catturare \\s(ovvero spazi bianchi come '', '\ n', '\ t') nel gruppo # 1 . +il segno serve per abbinare 1 o più token precedenti. Quindi (\\s)+possono essere caratteri consecutivi (1 o più) tra qualsiasi singolo carattere di spazio bianco ('', '\ n' o '\ t'). $1serve per sostituire le stringhe corrispondenti con la stringa del gruppo n. 1 (che contiene solo 1 carattere di spazio bianco) del tipo di corrispondenza (ovvero il singolo carattere di spazio bianco corrispondente). La soluzione sopra cambierà in questo modo:

   Hello!\n\n\nMy    World  

sarà

Hello!\nMy World

Non ho trovato la mia soluzione sopra qui, quindi l'ho pubblicata.


0

Se vuoi sbarazzarti di tutti gli spazi bianchi estranei principali e finali, allora vuoi fare qualcosa del genere:

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

Quindi puoi rimuovere i duplicati usando le altre strategie elencate qui:

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

0

Puoi anche provare a utilizzare String Tokeniser, per qualsiasi spazio, scheda, newline e tutto. Un modo semplice è,

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

-10

Ciò può essere possibile in tre passaggi:

  1. Converti la stringa in array di caratteri (ToCharArray)
  2. Richiedi loop sull'array charater
  3. Quindi applica la funzione di sostituzione della stringa (Sostituisci ("stringa che vuoi sostituire", "stringa originale"));

1
Questa non è una buona soluzione, passare a un array di caratteri non risolve nulla. In realtà non stai spiegando come eseguire la sostituzione, che è il nocciolo del problema. Inoltre, non pubblicare collegamenti completamente non correlati. In questo caso verrai contrassegnato come spammer.
Mat
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.