Java como substituir 2 ou mais espaços por espaço único na cadeia e excluir espaços à esquerda e à direita

271

Procurando uma maneira rápida e simples em Java para alterar essa sequência

" hello     there   "

para algo que se parece com isso

"hello there"

onde eu substituo todos esses espaços múltiplos por um único espaço, exceto que também quero que um ou mais espaços no início da string sejam removidos.

Algo assim me deixa parcialmente lá

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

mas não exatamente.

Nessa
fonte
5
Você deve aceitar uma resposta. Torna muito mais fácil para as pessoas que chegam à página mais tarde escolherem uma solução definitiva.
Paul Rooney
1
Essa é uma das maneiras mais recomendadas. =>. String nameWithProperSpacing = StringUtils.normalizeSpace (stringWithLotOfSpaces);
Kunal Vohra
s = s.replaceAll ("\\ s +", "");
Saroj Kumar Sahoo

Respostas:

461

Tente o seguinte:

String after = before.trim().replaceAll(" +", " ");

Veja também


Sem trim()regex

Também é possível fazer isso com apenas um replaceAll, mas isso é muito menos legível que a trim()solução. No entanto, é fornecido aqui apenas para mostrar o que a regex pode fazer:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

Existem 3 alternativas:

  • ^_+ : qualquer sequência de espaços no início da sequência
    • Combine e substitua por $1, que captura a sequência vazia
  • _+$ : qualquer sequência de espaços no final da sequência
    • Combine e substitua por $1, que captura a sequência vazia
  • (_)+ : qualquer sequência de espaços que não corresponda a nenhuma das opções acima, o que significa que está no meio
    • Combine e substitua por $1, que captura um único espaço

Veja também

poligenelubricants
fonte
11
+1, especialmente porque vale a pena notar que isso é feito trim()e, em seguida, replaceAll()usa menos memória do que o contrário. Não muito, mas se isso for chamado muitas vezes, pode aumentar, especialmente se houver muitos "espaços em branco ajustáveis". ( Trim()Não realmente se livrar do espaço extra - ele só esconde-lo, movendo os valores inicial e final do subjacente. char[]Permanece inalterado.)
corsiKa
2
É apenas um detalhe, mas eu acho que ( ) +ou ( ){2,}deve ser um (muito) pouco mais eficiente;)
sp00m
6
Nice regexp. Nota: substituir o espaço `` por \\ssubstituirá qualquer grupo de espaços em branco pelo caractere desejado.
djmj
1
Observe que a parte () + corresponderá a um único espaço e a substituirá por um único espaço. Talvez (<espaço> <espaço> +) seja melhor, portanto só corresponde se houver vários espaços e a substituição fará uma alteração líquida na cadeia de caracteres.
Lee Meador 27/07
2
Como Lee Meador mencionou, .trim().replaceAll(" +", " ")(com dois espaços) é mais rápido que .trim().replaceAll(" +", " ")(com um espaço). Executei testes de temporização em strings que tinham apenas espaços únicos e todos os espaços duplos, e ele veio substancialmente mais rápido para ambos ao realizar muitas operações (milhões ou mais, dependendo do ambiente).
Gary S. tecelão
154

Você só precisa de:

replaceAll("\\s{2,}", " ").trim();

onde você corresponde a um ou mais espaços, substitui-os por um único espaço e, em seguida, apara os espaços em branco no início e no final (você pode inverter primeiro aparando e depois combinando para tornar a regex mais rápida, como alguém apontou).

Para testar isso, tente rapidamente:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

e retornará:

"hello there"
sarah.ferguson
fonte
3
Provavelmente eu apararia primeiro, porque você está economizando um pouco de trabalho na regex.
Michael
3
@ sarah.ferguson Remova o suporte final ")" que não deveria estar presente no primeiro replaceAll. Obrigado. - O sistema não me deixou fazer isso! (Nada menos do que 6 caracteres é elegível para uma edição ..)
mwarren
2
Observe que isso substitui um espaço por outro espaço no caso em que não há vários espaços juntos. Nesse caso, não é necessário fazer a substituição, embora você queira, pois você também substitui uma guia por um único espaço. Seria bom reconhecer apenas vários espaços.
Lee Meador 27/07
2
@geowar, onde a pergunta pediu guias, desculpe? Eu tenho certeza que o acima não substitui símbolos as, bem como para esse assunto .. e nem ... #
sarah.ferguson
2
aguarde um segundo @geowar Isso substitui uma única tabela por um espaço. Eu apenas tentei
user1870400
42

Use o StringUtils.normalizeSpace(String str)método Apache commons . Veja os documentos aqui

Monica Granbois
fonte
Boa ideia, mas isso remove novas linhas entre outras coisas
Somaiah Kumbera
20

Isso funcionou perfeitamente para mim: sValue = sValue.trim().replaceAll("\\s+", " ");

Médico
fonte
1
As pessoas editaram minha resposta. O original era: sValue = sValue.replaceAll ("\ s +", "") .trim ();
Doutor
2
Foi editado porque a sua resposta original remove todos os espaços e não é isso que pediu ao OP
José Rui Santos
17
"[ ]{2,}"

Isso corresponderá a mais de um espaço.

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

RESULTADO:

hello there
Gitesh Dalal
fonte
13

Para eliminar espaços no início e no final da String, use o String#trim()método E então use o seu mytext.replaceAll("( )+", " ").

folone
fonte
12

Você pode primeiro usar String.trim()e, em seguida, aplicar o comando regex replace no resultado.

Eyal Schneider
fonte
10
trim () irá remover todo o espaço no início e no final da cadeia, não é aplicar-se para o espaço entre as palavras
vuhung3990
10

O código a seguir compactará qualquer espaço em branco entre as palavras e removerá qualquer no início e no final da string

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

Isso produzirá a string with many spaces, a tab and a newline

Observe que quaisquer caracteres não imprimíveis, incluindo espaços, guias e novas linhas, serão compactados ou removidos


Para mais informações, consulte a respectiva documentação:

xcuipir
fonte
9

Tente este.

Código de amostra

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

RESULTADO

hello there

Primeiro, ele substituirá todos os espaços por espaço único. Do que devemos fazer o corte, Stringporque o Início do Stringe o Fim do Stringmesmo substituirão todo o espaço por um espaço único, se Stringhouver espaços no Início do Stringe Fim do StringEntão, precisamos apará-los. Do que você deseja String.

Raj S. Rusia
fonte
4

Você também pode usar lookarounds.

test.replaceAll("^ +| +$|(?<= ) ", "");

OU

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )corresponde a um caractere de espaço que é seguido por outro caractere de espaço. Portanto, em espaços consecutivos, ele corresponderia a todos os espaços, exceto o último, porque não é seguido por um caractere de espaço. Isso deixa um espaço único para espaços consecutivos após a operação de remoção.

Exemplo:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }
Avinash Raj
fonte
Do jeito que você tem, ele corresponderá a qualquer espaço na frente ou no final ou a qualquer espaço único com outro espaço a seguir. Isso significa que "a .... b" corresponderá 3 vezes e será substituído três vezes. Ele itera sobre todos os espaços internos dentro do método replaceAll (). Talvez você possa alterá-lo para corresponder a qualquer sequência de 2 ou mais espaços ao mesmo tempo e reduzir a iteração interna.
Lee Meador 27/07
Talvez <espaço> + (? = <Espaço>) faça isso.
Lee Meador 27/07
4

aparar()

Remove apenas os espaços iniciais e finais.

No Java Doc, "Retorna uma string cujo valor é essa string, com qualquer espaço em branco à esquerda e à direita removido".

System.out.println(" D ev  Dum my ".trim());

"D ev Dum my"

replace (), replaceAll ()

Substitui todas as cadeias vazias na palavra,

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

Resultado:

"DevDummy"

"DevDummy"

"DevDummy"

Nota: "\ s +" é a expressão regular semelhante ao caractere de espaço vazio.

Referência: https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html

Sameera
fonte
4

Muitas respostas corretas foram fornecidas até agora e vejo muitas votações. No entanto, as formas mencionadas funcionarão, mas não serão realmente otimizadas ou não serão legíveis. Recentemente, deparei com a solução que todos os desenvolvedores vão gostar.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

Você terminou. Esta é uma solução legível.

Kunal Vohra
fonte
3

Em Kotlin, ficaria assim

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")
Rafael
fonte
2
String str = " hello world"

reduza os espaços primeiro

str = str.trim().replaceAll(" +", " ");

colocar em maiúscula a primeira letra e minúsculas em todo o resto

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();
KhaledMohamedP
fonte
2
mytext = mytext.replaceAll("\\s+"," ");
k sarath
fonte
As respostas somente de código são desencorajadas. Clique em editar e adicione algumas palavras resumindo como o seu código aborda a pergunta ou talvez explique como a sua resposta difere das respostas anteriores. Obrigado
Nick
1

Isso funcionou para mim

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

onde filtro está seguindo a função e varredura é a sequência de entrada:

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}
Mr_Hmp
fonte
1
Isso substituiria <space> <tab> por um espaço, mas não <tab> <tab>. Parece um pequeno problema.
Lee Meador 27/07
1

você deveria fazer assim

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

coloque + dentro de colchetes.

kiro malak
fonte
1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();
Ajinkya_M
fonte
0

Veja String.replaceAll.

Use o regex "\s"e substitua por " ".

Então use String.trim.

Zak
fonte
1
new String ( "Olá ") .replaceAll (" \\ s", "+") retorna a + Olá +++++++ há +++ então definitivamente não trabalho ..
sarah.ferguson
1
Tentenew String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s
0

verifique isso ...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

Se String contiver apenas espaço único, replace () não substituirá,

Se os espaços forem mais de um, a ação Substituir () executa e remove o espaço.

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

Contar o número de espaços em uma String.

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

Pattern .quote ("?") Retorna o padrão literal String.

Yash
fonte
0

Meu método antes de encontrar a segunda resposta usando o regex como uma solução melhor. Talvez alguém precise desse código.

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}
trinity420
fonte
Interessante, mas o espaço em branco significa mais do que apenas espaços em branco.
precisa
@LaurIvan, o que você quer dizer?
precisa
esta entrada tem uma boa explicação sobre o que \ssignifica expressões regulares (espaço, tabulação, nova linha, feed de formulário).
precisa
@LaurIvan Seu link está quebrado, mas você está certo. Esse problema pode ser resolvido através da iteração na string de entrada, removendo todos os caracteres não alfabéticos, não numéricos e não espaciais, eu acho.
precisa
0

Versão de fluxo, filtra espaços e tabulações.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
Aris2World
fonte
0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"
alaswer
fonte
0

O método mais simples para remover espaços em branco em qualquer lugar da string.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}
Sandun Susantha
fonte
-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

A solução acima é o algoritmo com a complexidade de O (n) sem usar nenhuma função java.

devmohd
fonte
-1

Por favor, use o código abaixo

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}
Piyush
fonte
-1

Olá desculpe pelo atraso! Aqui está a melhor e mais eficiente resposta que você está procurando:

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

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

Portanto, sua saída deste exemplo será: Meu nome é kingkon.

No entanto, este método removerá também o "\ n" que sua string pode ter. Portanto, se você não quiser, basta usar este método simples:

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

E se você quiser remover também os espaços à esquerda e à direita, adicione:

str = str.trim();
kostas poimenidhs
fonte
-1

Eu sei que o método replaceAll é muito mais fácil, mas eu queria postar isso também.

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}
esranur
fonte
1
Mesmo que isso funcione, está longe de ser a solução mais fácil.
platzhersh
-1

O Tokenizer de String pode ser usado

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
Swaran
fonte