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"
zyamat
fuente
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+","")
Gursel Koca
fuente
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).

nitro2k01
fuente
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).

Fletch
fuente
¿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
62

¿Qué tal replaceAll("\\s", ""). Consulte aquí .

Erkan Haspulat
fuente
49
¡Qué diferencia puede llegar un minuto tarde!
HDave
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.

jahir
fuente
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]+", "");
v.nivuahc
fuente
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
30

Si prefiere las clases de utilidad a expresiones regulares, hay un método trimAllWhitespace (String) en StringUtils en Spring Framework.

kamczak
fuente
13
Ideas alternativas son bienvenidas. Ayudarán a algunas personas, incluso si no a todos.
james.garriss
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

Jonas Elfström
fuente
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"

Varejones
fuente
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.

Ayaskant
fuente
7

Puedes hacerlo tan simplemente

String newMysz = mysz.replace(" ","");
Vinod Ranga
fuente
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
avngr
fuente
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

Fatsoft
fuente
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 .

JB Nizet
fuente
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.

usuario27
fuente
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);    
    }
}
Jayesh
fuente
3

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

Mohammad Raza
fuente
hay una respuesta como / igual a su sugerencia, arriba
omerhakanbilici
3

Usar apache string util class es mejor para evitar NullPointerException

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

Salida

abcdef
sendon1982
fuente
3

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

"myString".replace(Regex("\\s+"), "")
Jemshit Iskenderov
fuente
2
mysz = mysz.replace(" ","");

Primero con espacio, segundo sin espacio.

Entonces ya está hecho.

usuario2357526
fuente
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);
    }
}
Tony Nguyen
fuente
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.

Megavatio
fuente
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]", "")

Rakesh Chaudhari
fuente
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);
}
Abdur Rahman
fuente
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);  
    }
}
usuario9832813
fuente
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.

Rajesh Gurbani
fuente
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
Debutante
fuente
0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");
Abd Abughazaleh
fuente
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();

    }

}
Kunal Vohra
fuente