Substituir vários espaços em branco por um único espaço na sequência JavaScript


191

Eu tenho strings com espaços em branco extras, cada vez que há mais de um espaço em branco, eu gostaria que fosse apenas um.

Qualquer um? Eu tentei pesquisar no google, mas nada funcionou para mim.

obrigado


2
remover espaço em branco duplicado do final / início ou qualquer lugar do texto?
Ninjagecko 28/05

Respostas:


371

Algo assim:

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)


31
@Me Por favor, leia a pergunta com atenção: "cada vez que houver mais de um espaço em branco, gostaria que fosse apenas um".
bjornd

5
Não é óbvio? ele substitui mais de 1 caractere de espaço em branco por 1 caractere de espaço em branco. (o resultado desejado)
War

4
@CiaranG É um expresion regulares
Pomeroy

1
@ Wardy, perto :-). Ele substitui um OU mais por um espaço (mas, de fato, o resultado desejado).
greenoldman

1
E se alguém quiser substituir 1+ espaços em branco pelo mesmo tipo de espaço em branco? (por exemplo, 2 ou mais espaços com um espaço e 3 novas linhas com uma nova linha, etc.) se houver novas linhas e espaços, ele deverá ser substituído por uma nova linha, enquanto que, se houver espaços e tabulações, deverá ser substituído por um espaço
Tom

61

Você pode aumentar a String para implementar esses comportamentos como métodos, como em:

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

String.prototype.reduceWhiteSpace = function() {
    return this.replace(/\s+/g, ' ');
};

Agora, agora você pode usar os seguintes formulários elegantes para produzir as seqüências desejadas:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
Aumentar o protótipo do objeto padrão é um padrão realmente controverso. Eu não o recomendaria para uma pergunta tão básica.
bjornd

@XavierJohn É String, com um R, não Sting.
precisa saber é o seguinte

20

o uso de uma expressão regular com a função de substituição faz o truque:

string.replace(/\s/g, "")

Esta solução está errada de acordo com a pergunta. E eu realmente me pergunto por que você a postou dois dias depois de uma solução melhor ter sido postada ...
Sebastian Mach

Eu acho que na época, apenas esse código funcionou para mim. Não posso voltar atrás para confirmar. Obviamente, eu teria tentado a melhor solução primeiro. Além disso, após a verificação no console do Chrome, ambas as soluções pareciam funcionar. Curiosamente, no entanto, quando copiei o resultado para esta caixa de comentários, ele mostrou que minha solução não funcionava para vários espaços em branco. Talvez você possa me ajudar a entender o porquê. Eu acho que é um erro de cromo? Tente executar meu código no console do Chrome e me avise.
Roger Gajraj 13/09/2015

13

Aqui está uma solução não regex (apenas por diversão):

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

Ele divide a cadeia de caracteres por espaços em branco , remove todos os itens vazios da matriz (os que eram mais do que um único espaço) e junta todas as palavras novamente em uma cadeia de caracteres, com um único espaço em branco entre elas.


12

Presumo que você esteja procurando remover espaços do início e / ou final da string (em vez de remover todos os espaços?

Se for esse o caso, você precisará de uma regex como esta:

mystring = mystring.replace(/(^\s+|\s+$)/g,' ');

Isso removerá todos os espaços do início ou do fim da string. Se você deseja cortar apenas espaços a partir do final, a regex ficaria assim:

mystring = mystring.replace(/\s+$/g,' ');

Espero que ajude.


4
Gosto da simplicidade do seu regex, @Spudley, mas o seu código não substitui as execuções de espaços em branco no início e no final com um único caractere de espaço? Eu pensei que o objetivo era remover completamente o espaço em branco das extremidades; nesse caso, a string de substituição deveria estar em ''vez de ' '.
Randall Cozinhe


6

Eu sei que não devo necromancia sobre um assunto, mas, dados os detalhes da pergunta, eu geralmente a amplio para significar:

  • Quero substituir várias ocorrências de espaço em branco dentro da string por um único espaço
  • ... e ... não quero espaços em branco no início ou no final da sequência (aparar)

Para isso, uso um código como este (os parênteses no primeiro regexp existem apenas para tornar o código um pouco mais legível ... regexps pode ser uma dor, a menos que você esteja familiarizado com eles):

s = s.replace(/^(\s*)|(\s*)$/g, '').replace(/\s+/g, ' ');

A razão pela qual isso funciona é que os métodos no objeto String retornam um objeto string no qual você pode invocar outro método (assim como o jQuery e algumas outras bibliotecas). Forma muito mais compacta de codificar se você deseja executar vários métodos em um único objeto em sucessão.


+1 para o exemplo de "pronto para uso" .. Eu estava indo para postar a minha auto
d.raev

EXATAMENTE o que eu estava procurando, incrível!
Robertp

4

var x = "Teste Teste Teste" .split ("") .join (""); alerta (x);


5
Funciona, mas não é uma codificação inteligente. Este código é mais lento que um RegEx. Gostaria de saber se Split () não usa RegEx para dividir uma string!
Farandole

2

Tente isso.

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

o resultado será

string 1

O que aconteceu aqui é que ele irá aparar os espaços externos primeiro usando e trim()depois os espaços internos usando .replace(/\s+/g, ' ').


0

Se você deseja restringir o usuário a fornecer espaço em branco no nome, crie uma instrução if e forneça a condição. como eu fiz:

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • crie uma função JQuery.
  • este é o evento de pressionamento de tecla.
  • Inicialize uma variável.
  • Dê condições para combinar com o personagem
  • mostre uma mensagem de alerta para sua condição correspondente.

0

Que tal este?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

saídas "my test string with crazy stuff is cool "

Este se livra de todas as abas também


As guias já estão cobertas por \s. Regex desnecessariamente complexo, pode muito bem apenas escrever /\s+/g.
Anders Rabo Thorbeck
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.