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"

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

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+","")

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


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


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


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.


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]+", "");

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.


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


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"


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.


7

Você pode fazer isso simplesmente

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

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

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


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 .


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ê.


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


3

Use apache string util class é melhor evitar NullPointerException

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

Resultado

abcdef

3

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

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

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

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

Então está feito.


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


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.


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


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

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

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.


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

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

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

    }

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.