¿Cómo eliminar espacios en blanco duplicados en una cadena usando Java?

147

¿Cómo eliminar espacios en blanco duplicados (incluyendo pestañas, líneas nuevas, espacios, etc.) en una cadena usando Java?

estúpido
fuente

Respuestas:

378

Me gusta esto:

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

Por ejemplo

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

salidas

lorem ipsum dolor sit.

¿Qué significa eso \s+?

\s+Es una expresión regular. \scoincide con un espacio, tabulación, nueva línea, retorno de carro, avance de formulario o tabulación 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 de un carácter, con un solo carácter de espacio.


Fuente: Java: eliminación de espacios en blanco duplicados en cadenas

aioobe
fuente
3
@SuhrobSamiev - String.replaceAll () ha estado en Java desde JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles
3
Desearía poder agregar más de +1 para la increíble explicación de \ s +.
Cyntech
Lo entendí \s+pero ¿qué significa 2 barras invertidas \\?
saplingPro
2
El literal de cadena "\\"representa la cadena que consiste en una barra invertida única. Entonces, para representarlo \s+, escriba "\\s+".
aioobe
1
¿Esto eliminará el retorno de carro? o tendría que eliminar "\\ r" por separado? ¡Gracias!
user3388884
24

Puedes usar la expresión regular

(\s)\1

y

reemplazarlo con $1.

Código Java:

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

Si la entrada es como la "foo\t\tbar "obtendrá "foo\tbar ",
pero si la entrada es "foo\t bar", permanecerá sin cambios porque no tiene ningún espacio en blanco consecutivo.

Si trata todos los caracteres de espacio en blanco (espacio, tabulación vertical, tabulación horizontal, retorno de carro, avance de formulario, nueva línea) como espacio, puede usar la siguiente expresión regular para reemplazar cualquier cantidad de espacio en blanco consecutivo con un solo espacio:

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

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

str = str.replaceAll("\\s{2}"," ");
codictorio
fuente
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 stringestá su cadena en la que necesita eliminar los espacios en blanco duplicados?

Sachin Shanbhag
fuente
9

hola la forma más rápida (pero no la más bonita) que encontré es

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

esto se está ejecutando bastante rápido en Android en lugar de una expresión regular

wutzebaer
fuente
1
Funciona solo para espacios pero no para otros espacios en blanco, como pestañas y líneas nuevas.
Pang
1
Lo sé, tienes que agregar más de estos bucles while para otras entidades. Pero este código se ejecuta mucho más rápido en Android ya que estas expresiones regulares, tuve que procesar libros electrónicos completos.
wutzebaer
Enormemente más rápido en el escritorio también. No lo he probado para una cadena grande, pero si planea ejecutarlo en muchas cadenas pequeñas, esta es la respuesta que está buscando.
Ivelate
9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
oleg.cherednik
fuente
6

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

   Hello!\n\n\nMy    World  

estarán

 Hello!\nMy World 

Observe que todavía hay espacios en blanco iniciales y finales. Entonces mi solución completa es:

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

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

   Hello!\n\n\nMy    World  

estarán

Hello!\nMy World

No he encontrado mi solución anterior aquí, así que la he publicado.

arnobpl
fuente
0

Si desea deshacerse de todos los espacios en blanco extraños iniciales y finales, entonces desea hacer algo como esto:

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

Luego puede eliminar los duplicados utilizando las otras estrategias enumeradas aquí:

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

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

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

Esto puede ser posible en tres pasos:

  1. Convierta la cadena en una matriz de caracteres (ToCharArray)
  2. Solicitar bucle en la matriz de caracteres
  3. Luego aplique la función de reemplazo de cadena (Reemplazar ("picadura que desea reemplazar", "cadena original"));
Dheeraj en Techreuters
fuente
1
Esa no es una buena solución, dejar caer 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. Además, no publique enlaces completamente no relacionados. Te marcarán como spammer si lo haces.
Mat