Eliminar espacios en blanco de cadenas en Java


684

Tengo una cadena como esta:

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

Quiero eliminar los espacios en blanco en la cadena. Lo intenté, trim()pero esto solo elimina espacios en blanco antes y después de toda la cadena. También lo intenté replaceAll("\\W", "")pero luego =también se eliminó.

¿Cómo puedo lograr una cadena con:

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

1
\\Wsignifica todas las no palabras ver download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant

75
¿Cuál es su plan con la cadena "name = johnage = 13year = 2001"? No analizarlo, espero.
Jonas Elfström

44
@ JonasElfström Imagino que es para ayudar con las comparaciones de cadenas
Isaac

¿qué tal si la cadena es en realidad = "". ¿Es todo lo que trims () hace es borrar la cadena vacía como mencioné? @zyamat?
Gumuruh

Respuestas:


1288

st.replaceAll("\\s+","")elimina todos los espacios en blanco y los caracteres no visibles (p. ej., tabulación \n).


st.replaceAll("\\s+","")y st.replaceAll("\\s","")produce el mismo resultado.

La segunda expresión regular es un 20% más rápida que la primera, pero a medida que aumenta el número de espacios consecutivos, la primera funciona mejor que la segunda.


Asigne el valor a una variable, si no se usa directamente:

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

34
Me gustaría señalar que estas dos expresiones regulares producirán resultados diferentes si está buscando reemplazar todo el espacio en blanco con un solo espacio (o algún otro conjunto de caracteres). Si tiene espacios consecutivos, el uso de \\ s reemplazará cada carácter de espacio en blanco con los caracteres proporcionados. Dado \\ s +, reemplazará cada conjunto de espacios en blanco con una sola cadena de reemplazo. Puedo ver bastantes casos en los que las personas pueden venir a esta publicación para reemplazar los espacios en blanco con algo que no es solo una cadena vacía, y esto puede ser útil.
Caitlin

2
pero no elimina el espacio en blanco si está al comienzo de la cadena.
solitario

@lonesome use .trim () para eso
CQM

66
Simplemente use StringUtils de apache-commons. Es un método estático llamado StringUtils.deleteWhitespace.
Crozeta

@Gursel gracias por la respuesta y la comparación de rendimiento para dos expresiones regulares. Me preguntaba por qué hay una diferencia de rendimiento entre dos. ¿Me falta algo? ¿Podría señalarme alguna referencia que hable más sobre la diferencia de rendimiento?
Vishrant

247
replaceAll("\\s","")

\w = Cualquier cosa que sea un carácter de palabra

\W = Cualquier cosa que no sea un carácter de palabra (incluyendo puntuación, etc.)

\s = Cualquier cosa que sea un carácter de espacio (incluidos espacios, caracteres de tabulación, etc.)

\S = Cualquier cosa que no sea un espacio (incluyendo letras y números, así como puntuación, etc.)

(Editar: como se señaló, debe escapar de la barra diagonal inversa si desea \sllegar al motor de expresiones regulares, lo que da como resultado \\s).


103

La respuesta más correcta a la pregunta es:

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

Acabo de adaptar este código de las otras respuestas. Lo estoy publicando porque, además de ser exactamente lo que solicitó la pregunta, también demuestra que el resultado se devuelve como una nueva cadena, la cadena original no se modifica como algunas de las respuestas implican.

(Los desarrolladores experimentados de Java podrían decir "por supuesto, no se puede modificar una Cadena", pero el público objetivo de esta pregunta puede no saberlo).


¿Significa esto que podemos sobrescribir la cadena original escribiendo, por ejemplo: S = S.replaceAll ("\\ s", ""); mientras que primero se realizará el reemplazo y luego S recibirá la versión de S
frogeyedpeas del

@frogeyedpeas Eso sobrescribe la variable Spero no sobrescribe la cadena que Sapunta.
Restablece a Mónica el

Me salvó el día! ;)
Paras Jain


45

Una forma de manejar las manipulaciones de String es StringUtils de Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Lo puedes encontrar aquí . commons-lang incluye mucho más y está bien soportado.


Esto tiene la ventaja de ser más legible.
Payne

36

Si necesita eliminar espacios irrompibles también, puede actualizar su código de esta manera:

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

Esto falla para: " ab c "
Mohd Farid

1
@MohdFarid aplicó una solución, tengo que estar bien ahora.
Denis Kulagin

Creo que debería ser st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk


25

Ya has recibido la respuesta correcta de Gursel Koca, pero creo que hay muchas posibilidades de que esto no sea lo que realmente quieres hacer. ¿Qué tal analizar los valores-clave en su lugar?

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

salida:
nombre = john
edad = 13
años = 2001


22

Deberías usar

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

en vez de:

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

De esta manera, funcionará con más de un espacio entre cada cadena. El signo + en la expresión regular anterior significa "uno o más \ s"


2
Escribí un ejemplo rápido para verificar esto porque me pareció extraño y descubrí que el signo más agregado no es necesario. Se consumen múltiples espacios que separan palabras. La razón de esto es más probable que se replaceAllrepita hasta que el patrón no coincida con ninguna parte de la cadena.
nyaray

2
En efecto. Esto +puede hacerlo marginalmente más amigable con la CPU, porque los espacios en blanco consecutivos se manejan en una sola operación de reemplazo, pero esa es la única diferencia en este caso. De hecho, es el All, no el +que reemplaza el espacio en blanco no consecutivo en la cadena.
nitro2k01

no elimina esto (u00A0)
Kerim FIRAT

8

La forma más fácil de hacer esto es usar la org.apache.commons.lang3.StringUtilsclase de commons-lang3biblioteca como "commons-lang3-3.1.jar " por ejemplo.

Use el método estático " StringUtils.deleteWhitespace(String str)" en su cadena de entrada y le devolverá una cadena después de eliminar todos los espacios en blanco. Probé su cadena de ejemplo " name=john age=13 year=2001" y me devolvió exactamente la cadena que deseaba - " name=johnage=13year=2001". Espero que esto ayude.


7

Puedes hacerlo tan simplemente

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

Sorprendentemente, el único trabajador en mi situación. Gracias.
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("  "," ");

// funciona bien con cualquier espacio * no olvides el espacio en la picadura b


Muy útil, pero no responde la pregunta publicada.
BuvinJ

3

\Wsignifica "carácter no verbal". El patrón para los espacios en blanco es \s. Esto está bien documentado en el Patrón javadoc .


8
¿Dónde está el resto de esta respuesta?
LS

3

En java podemos hacer la siguiente operación:

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

para esto necesita importar los siguientes paquetes a su programa:

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

Espero que te ayude.


Esta información ha sido proporcionada por otros años antes de que publicara su respuesta.
Jan Groth

3

Usando Pattern And Matcher es más dinámico.

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

Usar apache string util class es mejor para evitar NullPointerException

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

Salida

abcdef

3

Cuando lo use st.replaceAll("\\s+","")en Kotlin , asegúrese de envolverlo "\\s+"con Regex :

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

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

Primero con espacio, segundo sin espacio.

Entonces ya está hecho.


77
Solo para aclarar, el espacio en blanco significa [ \t\n\x0B\f\r]. Solo estás haciendo [ ]espacios normales .
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

Para eliminar espacios en su ejemplo, esta es otra forma de hacerlo:

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

Lo que hace es convertirlo en una matriz con los espacios como separadores, y luego combina los elementos de la matriz sin los espacios.

Funciona bastante bien y es fácil de entender.


2
Pero una solución muy ineficiente. Y, como puede ver en las otras soluciones, esto solo funciona para "" espacio, y no para diferentes tipos de espacios en blanco.
GhostCat

1

Hay otros caracteres espaciales que también existen en cadenas. Por lo tanto, es posible que debamos reemplazar los caracteres espaciales de las cadenas.

Ej: ESPACIO SIN INTERRUPCIONES, ESPACIO TRES POR EM, ESPACIO DE PUNTUACIÓN

Aquí está la lista de espacio char http://jkorpela.fi/chars/spaces.html

Entonces necesitamos modificar

\ u2004 nosotros por ESPACIO TRES POR EM

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


0

El espacio en blanco se puede eliminar usando la función isWhitespace de la clase de caracteres.

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

Separe cada grupo de texto en su propia subcadena y luego concatene esas subcadenas:

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

Esto puede ayudar.


0

También puede echar un vistazo al siguiente código de Java. Los siguientes códigos no utilizan ningún método "incorporado".

/**
 * 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));

    }
}

Entrada:

String inp = "01239Debashish123Pattn456aik";

Salida:

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

Se proporcionan muchas respuestas. Me gustaría dar una solución que sea bastante legible y mejor que 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();

    }

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.