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

véspera
fonte
2
remover espaço em branco duplicado do final / início ou qualquer lugar do texto?
Ninjagecko 28/05
Possível duplicado de Regex para substituir vários espaços com um único espaço
Muhammad Omar ElShourbagy

Respostas:

371

Algo assim:

var s = "  a  b     c  ";

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

bjornd
fonte
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();
gui pn
fonte
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, "")
Roger Gajraj
fonte
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.

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

Spudley
fonte
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
8

jQuery.trim () funciona bem.

http://api.jquery.com/jQuery.trim/

chug2k
fonte
14
Lembre-se de que isso não remove todos os espaços em branco. Citando os documentos: "Remova o espaço em branco do início e do fim de uma string ."
Jonik
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.

Markku Uttula
fonte
+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);

Praveen Kumar Thalluri
fonte
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, ' ').

Richard Vergis
fonte
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.
Abhijit BIswas
fonte
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

user3413723
fonte
As guias já estão cobertas por \s. Regex desnecessariamente complexo, pode muito bem apenas escrever /\s+/g.
Anders Rabo Thorbeck