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?

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


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

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


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


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"

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.


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

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

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

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