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.


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


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"

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


20

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


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

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


12

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


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:


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.


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("^ +| +$| (?= )", "")
            );
        }

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


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.


3

Em Kotlin, ficaria assim

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")

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

2
mytext = mytext.replaceAll("\\s+"," ");

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

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.


1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();

0

Veja String.replaceAll.

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

Então use String.trim.


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.


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

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

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

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

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


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

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

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

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