2010-10-18 20 views

Respuesta

354

De esta manera:

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

Por ejemplo

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

salidas

lorem ipsum dolor sit. 

¿Qué quiere decir que \s+?

\s+ es una expresión regular. \s coincide con un espacio, pestaña, nueva línea, retorno de carro, avance de página o pestaña vertical, y + dice "uno o más de esos". Por lo tanto, el código anterior colapsará todas las "subcadenas de espacios en blanco" más largas que un carácter, con un solo carácter de espacio.


Fuente: Java: Removing duplicate white spaces in strings

+0

por qué no existe un método replaceAll ?? ¿El último JDK admite este método? –

+2

@SuhrobSamiev - String.replaceAll() ha estado en Java desde JDK 1.4. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String) –

+3

Ojalá pudiera agregar más de +1 para la increíble explicación de \ s +. – Cyntech

9

Prueba esto - Tienes que import java.util.regex.*;

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

Dónde string es su cadena en la que es necesario eliminar los espacios en blanco duplicados

23

Usted puede utilizar la expresión regular

(\s)\1 

y

sustituirlo por $1.

código Java:

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

Si la entrada es "foo\t\tbar " obtendrá como salida "foo\tbar "
Pero si la entrada es "foo\t bar" que se mantendrá sin cambios, ya que no tiene ningún espacios en blanco consecutivos.

Si usted trata a todos los caracteres de espacio en blanco (espacio, tabulador vertical, tabulador horizontal, retorno de carro, avance de hoja nueva línea) como el espacio, puede utilizar la siguiente expresión regular para reemplazar cualquier número de espacios en blanco consecutivos con una solo espacio:

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

Pero si desea reemplazar dos espacios en blanco consecutivos con un solo espacio que debe hacer:

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

Esto puede ser posible en tres pasos:

  1. Convertir la cadena en al arreglo de caracteres (ToCharArray)
  2. Aplicar para el bucle en la matriz de charater
  3. A continuación, aplicar cadena de la función replace (Reemplazar ("pican desea reemplazar", "cadena original"));
+1

Esa no es una buena solución, cayendo a una matriz de caracteres no resuelve nada. En realidad, no está explicando cómo hacer el reemplazo, que es el núcleo del problema. También, por favor, ** no ** publique enlaces completamente no relacionados. Si lo haces, serás marcado como spammer. – Mat

0

Si desea deshacerse de todo espacio inicial y final extraña entonces usted quiere hacer algo como esto:

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

A continuación, puede eliminar los duplicados utilizando las otras estrategias mencionadas aquí:

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

hola el (camino, pero no más bonita) más rápido que he encontrado es

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

esto se está ejecutando bastante rápido en Android en oposición a una expresión regular

+1

Funciona solo para espacios pero no para otros espacios en blanco como pestañas y nuevas líneas. – Pang

+1

Lo sé, tienes que agregar más de estos while loops para otras entidades. Pero este código se ejecuta mucho más rápido en Android que estos regex, tuve que procesar libros electrónicos completos. – wutzebaer

+0

Enormemente más rápido en el escritorio también. No lo he probado para una cadena grande, pero si planeas ejecutarlo en muchas cuerdas pequeñas esta es la respuesta que estás buscando. – Ivelate

5

Aunque es demasiado tarde, he encontrado una mejor solución (que funciona para mí) que reemplazará todos los espacios blancos del mismo tipo consecutivos con un espacio en blanco de su tipo. Es decir:

Hello!\n\n\nMy World 

habrá

Hello!\nMy World 

Aviso todavía hay espacios iniciales y finales blancos. Así que mi solución completa es:

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

Aquí, trim() sustituye a todas las cadenas de ataque y de salida de espacio en blanco con "". (\\s) es para capturar \\s (es decir, espacios en blanco como '', '\ n', '\ t') en grupo # 1. El signo + es para hacer coincidir 1 o más token anterior. Por lo tanto, (\\s)+ pueden ser caracteres consecutivos (1 o más) entre cualquier carácter de espacio en blanco ('', '\ n' o '\ t'). $1 es para reemplazar las cadenas coincidentes con el cadena # 1 cadena (que solo contiene 1 carácter de espacio en blanco) del tipo coincidente (que es el único carácter de espacio en blanco que ha coincidido). La solución anterior cambiará así:

Hello!\n\n\nMy World 

habrá

Hello!\nMy World 

no he encontrado mi solución anterior aquí, así que he fijado él.

0

También puede intentar usar String Tokeniser, para cualquier espacio, pestaña, nueva línea y todo. Una forma sencilla es,

String s = "Your Text Here";   
StringTokenizer st = new StringTokenizer(s, " "); 
while(st.hasMoreTokens()) 
{ 
    System.out.print(st.nextToken()); 
} 
8
String str = " Text with multiple spaces "; 
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str); 
// str = "Text with multiple spaces" 
Cuestiones relacionadas