Como remover espaços em branco duplicados na string usando Java?

147

Como remover espaços em branco duplicados (incluindo guias, novas linhas, espaços, etc ...) em uma string usando Java?

sem cérebro
fonte

Respostas:

378

Como isso:

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

Por exemplo

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

saídas

lorem ipsum dolor sit.

O que isso \s+significa?

\s+é uma expressão regular. \scorresponde a um espaço, tabulação, nova linha, retorno de carro, alimentação de formulário ou tab vertical e +diz "um ou mais desses". Portanto, o código acima recolherá todos os "substrings de espaço em branco" com mais de um caractere, com um único caractere de espaço.


Origem: Java: Removendo Espaços em Branco Duplicados em Strings

aioobe
fonte
3
@SuhrobSamiev - String.replaceAll () está em Java desde o JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles
3
Gostaria de poder adicionar mais de um para a incrível explicação de \ s +.
Cyntech 01/06
Eu entendi, \s+mas o que significa 2 barra invertida \\?
precisa saber é o seguinte
2
A cadeia literal "\\"representa a cadeia que consiste em uma única barra invertida. Então, para representar \s+você escreve "\\s+".
aioobe
1
Isso removerá o retorno de carro? ou eu teria que remover "\\ r" separadamente? Obrigado!
user3388884
24

Você pode usar o regex

(\s)\1

e

substitua-o por $1 .

Código Java:

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

Se a entrada for, "foo\t\tbar "você terá "foo\tbar "como saída.
Mas, se a entrada for, "foo\t bar"ela permanecerá inalterada, pois não possui caracteres de espaço em branco consecutivos.

Se você tratar todos os caracteres de espaço em branco (espaço, guia vertical, guia horizontal, retorno de carro, alimentação de formulário, nova linha) como espaço, poderá usar o seguinte regex para substituir qualquer número de espaços em branco consecutivos por um único espaço:

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

Mas se você deseja substituir dois espaços em branco consecutivos por um único espaço, faça o seguinte:

str = str.replaceAll("\\s{2}"," ");
codaddict
fonte
9

Tente isso - você precisa import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

Onde stringestá sua string na qual você precisa remover espaços em branco duplicados

Sachin Shanbhag
fonte
9

oi a maneira mais rápida (mas não a mais bonita) que encontrei é

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

isso está correndo muito rápido no android, em frente a um regex

wutzebaer
fonte
1
Funciona apenas para espaços, mas não para outros espaços em branco, como guias e novas linhas.
Pang
1
Eu sei, você tem que adicionar mais desses loops para outras entidades. Mas esse código funciona muito mais rápido no Android, pois esses regex, eu tive que processar ebooks completos.
Wutzebaer
Extremamente mais rápido no desktop também. Não o testei para uma string grande, mas se você planeja executá-la em várias strings pequenas, esta é a resposta que você está procurando.
Ivelate
9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
oleg.cherednik
fonte
6

Embora seja tarde demais, eu encontrei uma solução melhor (que funciona para mim) que substituirá todos os espaços em branco consecutivos do mesmo tipo por um espaço em branco desse tipo. Isso é:

   Hello!\n\n\nMy    World  

será

 Hello!\nMy World 

Observe que ainda existem espaços em branco iniciais e finais. Então, minha solução completa é:

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

Aqui, trim()substitui todas as cadeias de espaço em branco à esquerda e à direita por "". (\\s)é para capturar \\s(ou seja, espaços em branco como '', '\ n', '\ t') no grupo # 1 . +sign é para combinar 1 ou mais token anterior. Assim, (\\s)+podem haver caracteres consecutivos (1 ou mais) entre qualquer caractere de espaço em branco ('', '\ n' ou '\ t'). $1é para substituir as cadeias correspondentes pelo grupo nº 1 (que contém apenas 1 caractere de espaço em branco) do tipo correspondente (que é o caractere de espaço em branco único correspondente). A solução acima mudará assim:

   Hello!\n\n\nMy    World  

será

Hello!\nMy World

Eu não encontrei minha solução acima aqui, então eu a publiquei.

arnobpl
fonte
0

Se você deseja se livrar de todos os espaços em branco externos iniciais e finais, você deve fazer algo assim:

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

Em seguida, você pode remover as duplicatas usando as outras estratégias listadas aqui:

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

Você também pode tentar usar o Tokeniser de String, para qualquer espaço, guia, nova linha e tudo. Uma maneira simples é,

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

Isso pode ser possível em três etapas:

  1. Converta a string em uma matriz de caracteres (ToCharArray)
  2. Solicitar loop no array de caracteres
  3. Em seguida, aplique a função de substituição de string (Substitua ("picada que deseja substituir", "string original"));
Dheeraj na Techreuters
fonte
1
Essa não é uma boa solução, passar para uma matriz de caracteres não resolve nada. Na verdade, você não está explicando como fazer a substituição, que é o núcleo do problema. Também não publique links completamente não relacionados. Você será sinalizado como um spammer se fizer isso.
21411 Mat