Removendo o espaço em branco das seqüências de caracteres em Java

684

Eu tenho uma string como esta:

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

Eu quero remover os espaços em branco na string. Eu tentei, trim()mas isso remove apenas os espaços em branco antes e depois de toda a cadeia. Eu também tentei, replaceAll("\\W", "")mas então o =também é removido.

Como posso obter uma string com:

mysz2 = "name=johnage=13year=2001"
zyamat
fonte
1
\\Wsignifica todas as não-palavras, consulte download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant
75
Qual é o seu plano com a string "name = johnage = 13year = 2001"? Não para analisá-lo, espero.
Jonas Elfstrom
4
@ JonasElfström Imagino seu para ajudar com comparações de strings
Isaac
Que tal se a string é realmente = "". É tudo o que trims () faz é limpar a string vazia, como mencionei? @zyamat?
Gmuruh
Possível duplicata Como remover espaço em branco na corda java
kibou Hassan

Respostas:

1287

st.replaceAll("\\s+","")remove todos os espaços em branco e caracteres não visíveis (por exemplo, tabulação \n).


st.replaceAll("\\s+","")e st.replaceAll("\\s","")produza o mesmo resultado.

O segundo regex é 20% mais rápido que o primeiro, mas à medida que o número de espaços consecutivos aumenta, o primeiro tem um desempenho melhor que o segundo.


Atribua o valor a uma variável, se não for usado diretamente:

st = st.replaceAll("\\s+","")
Gursel Koca
fonte
34
Gostaria de observar que esses dois regexs produzirão resultados diferentes se você estiver procurando substituir todos os espaços em branco por um único espaço (ou algum outro conjunto de caracteres). Se você tiver espaços consecutivos, usar \\ s substituirá cada caractere de espaço em branco pelos caracteres fornecidos. Dado \\ s +, ele substituirá cada conjunto de espaços em branco por uma única sequência de substituição. Eu posso ver alguns casos em que as pessoas podem estar chegando a este post por substituir espaços em branco por algo que não é apenas uma string vazia, e isso pode ser útil.
Caitlin #
2
mas não remove o espaço em branco se estiver no início da string.
Solitariamente
@lonesome use .trim () para isso
CQM
6
Basta usar StringUtils do apache-commons. É um método estático chamado StringUtils.deleteWhitespace.
Crozeta
@Gursel, obrigado pela resposta e comparação de desempenho para dois regex. Eu queria saber por que há uma diferença de desempenho entre dois? Há alguma coisa que me falta, você poderia me indicar alguma referência que fale mais sobre a diferença de desempenho?
Vishrant
247
replaceAll("\\s","")

\w = Qualquer coisa que seja um caractere de palavra

\W = Qualquer coisa que não seja um caractere de palavra (incluindo pontuação, etc.)

\s = Qualquer coisa que seja um caractere de espaço (incluindo espaço, caracteres de tabulação etc.)

\S = Qualquer coisa que não seja um caractere de espaço (incluindo letras e números, além de pontuação etc.)

(Editar: como indicado, você precisa escapar da barra invertida se quiser \salcançar o mecanismo de expressão regular, resultando em \\s.)

nitro2k01
fonte
103

A resposta mais correta para a pergunta é:

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

Acabei de adaptar esse código das outras respostas. Estou publicando porque, além de ser exatamente o que a pergunta solicitada, também demonstra que o resultado é retornado como uma nova string, a string original não é modificada, como algumas das respostas sugerem.

(Desenvolvedores Java experientes podem dizer "é claro que você não pode realmente modificar uma String", mas o público-alvo desta pergunta pode não saber disso.)

Fletch
fonte
Isso significa que podemos substituir a string original escrevendo por exemplo: S = S.replaceAll ("\\ s", ""); Considerando primeiro a substituição será feito e, em seguida, S receberá a versão characterstripped de S
frogeyedpeas
@frogeyedpeas Isso substitui a variável, Smas não substitui a string que Saponta para.
Reintegrar Monica
Salvou o meu dia! ;)
Paras Jain 6/17
62

Que tal replaceAll("\\s", ""). Consulte aqui .

Erkan Haspulat
fonte
49
Que diferença um atraso de um minuto pode fazer!
usar o seguinte comando
45

Uma maneira de lidar com manipulações de String é o StringUtils do Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Você pode encontrá-lo aqui . O commons-lang inclui muito mais e é bem suportado.

jahir
fonte
Isso tem a vantagem de ser mais legível.
payne
36

Se você precisar remover espaços inquebráveis ​​também, atualize seu código assim:

st.replaceAll("[\\s|\\u00A0]+", "");
v.nivuahc
fonte
Isso falha para: " ab c "
Mohd Farid
1
@MohdFarid Aplicou uma correção, tem que estar bem agora.
Denis Kulagin
Eu acho que deveria ser st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk
30

Se você preferir classes de utilitário a expressões regulares, existe um método trimAllWhitespace (String) em StringUtils no Spring Framework.

kamczak
fonte
13
Idéias alternativas são bem-vindas. Eles ajudarão algumas pessoas, mesmo que não todos.
James.garriss
25

Você já recebeu a resposta correta de Gursel Koca, mas acredito que há uma boa chance de que não seja isso que você realmente deseja fazer. Que tal analisar os valores-chave?

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

saída:
nome = john
idade = 13
anos = 2001

Jonas Elfström
fonte
22

Você deveria usar

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

ao invés de:

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

Dessa forma, ele funcionará com mais de um espaço entre cada sequência. O sinal + na regex acima significa "um ou mais \ s"

Varejones
fonte
2
Digitei um exemplo rápido para verificar isso, porque parecia estranho para mim e descobri que o sinal de adição adicionado não é necessário. Vários espaços que separam as palavras são consumidos. A razão para isso é mais provável que se replaceAllrepita até que o padrão não corresponda a nenhuma parte da sequência.
Nyaray 16/07/2013
2
De fato. O +pode tornar marginalmente mais CPU amigável, porque os espaços em branco consecutivos é tratado em uma única operação de substituição, mas essa é a única diferença neste caso. É de fato o All, não o +que está substituindo o espaço em branco não consecutivo na string.
Nitro2k01 18/10/2013
ele não exclui isso (u00A0)
Kerim FIRAT 5/19/19
8

A maneira mais fácil de fazer isso é usando a org.apache.commons.lang3.StringUtilsclasse da commons-lang3biblioteca, como " commons-lang3-3.1.jar" por exemplo.

Use o método estático " StringUtils.deleteWhitespace(String str)" na sua string de entrada e ela retornará uma string depois de remover todos os espaços em branco dela. Eu tentei o seu exemplo de string " name=john age=13 year=2001" e ele me retornou exatamente a string que você queria - " name=johnage=13year=2001". Espero que isto ajude.

Ayaskant
fonte
7

Você pode fazer isso simplesmente

String newMysz = mysz.replace(" ","");
Vinod Ranga
fonte
Surpreendentemente, o único trabalhador na minha situação. Obrigado.
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
fonte
4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// funciona bem com qualquer espaço * não esqueça o espaço na picada b

fatsoft
fonte
Muito útil, mas não responde à pergunta postada!
BuvinJ
3

\Wsignifica "caractere sem palavra". O padrão para caracteres de espaço em branco é \s. Isso está bem documentado no javadoc Pattern .

JB Nizet
fonte
8
Onde está o resto dessa resposta?
LS
3

Em java, podemos fazer a seguinte operação:

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 isso, você precisa importar os seguintes pacotes para o seu programa:

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

Espero que ajude você.

user27
fonte
Esta informação foi fornecida por outras pessoas anos antes de você postar sua resposta.
Jan Groth
3

Usando Pattern And Matcher é mais 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
fonte
3

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

Mohammad Raza
fonte
não há resposta como / é igual a sua sugestão, acima
omerhakanbilici
3

Use apache string util class é melhor evitar NullPointerException

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

Resultado

abcdef
sendon1982
fonte
3

Ao utilizar st.replaceAll("\\s+","")em Kotlin , certifique-se de embrulhar "\\s+"com Regex :

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

Primeiro com espaço, segundo sem espaço.

Então está feito.

user2357526
fonte
7
Apenas para esclarecer, espaço em branco significa [ \t\n\x0B\f\r]. Você está apenas fazendo [ ]espaços normais .
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
fonte
1

Para remover espaços no seu exemplo, esta é outra maneira de fazer isso:

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

O que isso faz é convertê-lo em uma matriz com os espaços sendo os separadores e, em seguida, combina os itens na matriz sem os espaços.

Funciona muito bem e é fácil de entender.

Megawatt
fonte
2
Mas uma solução muito ineficiente. E, como você pode ver nas outras soluções - isso só "" funciona para o espaço - e não para diferentes tipos de espaços em branco.
GhostCat 01/08/19
1

Existem outros caracteres de espaço também em strings. Portanto, precisamos de substituir o espaço por strings.

Ex: ESPAÇO SEM QUEBRA, ESPAÇO TRÊS POR EM, ESPAÇO DE PONTUAÇÃO

Aqui está a lista de caracteres de espaço http://jkorpela.fi/chars/spaces.html

Então, precisamos modificar

\ u2004 para ESPAÇO TRÊS POR EM

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

Rakesh Chaudhari
fonte
0

O espaço em branco pode ser removido usando a função isWhitespace da Classe 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
fonte
0

Separe cada grupo de texto em sua própria substring e concatene essas substrings:

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);  
    }
}
user9832813
fonte
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;
}

Isso pode ajudar.

Rajesh Gurbani
fonte
0

Você também pode dar uma olhada no código Java abaixo. Os códigos a seguir não usam nenhum método "interno".

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

Resultado:

The String is: 01239123456
Deb
fonte
0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");
Abd Abughazaleh
fonte
0

São fornecidas muitas respostas. Gostaria de dar uma solução que seja bastante legível e melhor que o 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
fonte