Regex para replace vários espaços por um único espaço

Dada uma string como:

  "O cachorro tem uma cauda longa e é VERMELHO!" 

Que tipo de magia jQuery ou JavaScript pode ser usada para manter espaços em apenas um espaço no máximo?

Objetivo:

  "O cachorro tem uma cauda longa e é VERMELHO!" 

Dado que você também quer cobrir abas, novas linhas, etc, basta replace \s\s+ por ' ' :

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

Se você realmente quiser cobrir apenas espaços (e, portanto, não guias, novas linhas, etc.), faça isso:

 string = string.replace(/ +/g, ' '); 

Desde que você parece estar interessado em desempenho, eu perfilei estes com Firebug. Aqui estão os resultados que recebi:

 str.replace( / +/g, ' ' ) -> 790ms str.replace( / +/g, ' ' ) -> 380ms str.replace( / {2,}/g, ' ' ) -> 470ms str.replace( /\s\s+/g, ' ' ) -> 390ms str.replace( / +(?= )/g, ' ') -> 3250ms 

Isto está no Firefox, executando 100k substituições de strings.

Encorajo-o a fazer seus próprios testes de perfil com o firebug, se você acha que o desempenho é um problema. Os humanos são notoriamente ruins em prever onde estão os gargalos em seus programas.

(Além disso, observe que a barra de ferramentas do desenvolvedor do IE 8 também possui um profiler embutido – pode valer a pena verificar como é o desempenho no IE.)

 var str = "The dog has a long tail, and it is RED!"; str = str.replace(/ {2,}/g,' '); 

EDIT: Se você deseja replace todos os tipos de caracteres em branco, a maneira mais eficiente seria assim:

 str = str.replace(/\s{2,}/g,' '); 

Esta é uma solução, embora tenha como alvo todos os caracteres de espaço:

 "The dog has a long tail, and it is RED!".replace(/\s\s+/g, ' ') "The dog has a long tail, and it is RED!" 

Edit : Isto é provavelmente melhor, pois tem como alvo um espaço seguido por um ou mais espaços:

 "The dog has a long tail, and it is RED!".replace(/ +/g, ' ') "The dog has a long tail, and it is RED!" 

Método alternativo:

 "The dog has a long tail, and it is RED!".replace(/ {2,}/g, ' ') "The dog has a long tail, and it is RED!" 

Eu não usei /\s+/ por si só, já que ele substitui espaços que abrangem 1 caractere várias vezes e pode ser menos eficiente, já que ele segmenta mais do que o necessário.

Eu não testei profundamente nada disso, por isso lmk se houver bugs.

Além disso, se você for fazer uma substituição de string, lembre-se de reatribuir a variável / propriedade ao seu próprio substituto, por exemplo:

 var string = 'foo' string = string.replace('foo', '') 

Usando jQuery.prototype.text:

 var el = $('span:eq(0)'); el.text( el.text().replace(/\d+/, '') ) 

Eu tenho esse método, eu chamo de método Derp por falta de um nome melhor.

 while (str.indexOf(" ") !== -1) { str = str.replace(/ /g, " "); } 

Executá-lo no JSPerf dá alguns resultados surpreendentes.

Mais robusto:

  function trim (palavra)
 {
     word = word.replace (/ [^ \ x21- \ x7E] + / g, '');  // altera os caracteres não imprimíveis para espaços
     return word.replace (/ ^ \ s + | \ s + $ / g, '');  // remove espaços iniciais / finais
 }

Um método mais robusto: isso também remove os espaços inicial e final, se existirem. Por exemplo:

 // NOTE the possible initial and trailing spaces var str = " The dog has a long tail, and it is RED! " str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, ""); // str -> "The dog has a long tail, and it is RED !" 

Seu exemplo não tem esses espaços, mas eles também são um cenário muito comum, e a resposta aceita foi apenas apará-los em espaços simples, como: “O … VERMELHO!”, Que não é o que você normalmente precisará.

Eu sugiro

 string = string.replace(/ +/g," "); 

por apenas espaços
OU

 string = string.replace(/(\s)+/g,"$1"); 

para transformar vários retornos em um único retorno também.

Aqui está uma solução alternativa, se você não quiser usar replace (replace espaços em uma seqüência de caracteres sem usar o javascript de substituição)

 var str="The dog has a long tail, and it is RED!"; var rule=/\s{1,}/g; str = str.split(rule).join(" "); document.write(str); 

Eu sei que estou atrasado para a festa, mas descobri uma boa solução.

Aqui está:

 var myStr = myStr.replace(/[ ][ ]*/g, ' '); 

Resposta descriptografada abrangente para iniciantes e outros.

Isto é para todos os manequins como eu, que testam os scripts escritos por alguns de vocês que não funcionam.

Os 3 exemplos seguintes são os passos que tomei para remover caracteres especiais E espaços extras nos 3 sites seguintes (todos funcionam perfeitamente) {1. EtaVisa.com 2. EtaStatus.com 3. Tikun.com} então eu sei que estes funcionam perfeitamente.

Nós acorrentamos estes juntos com mais de 50 de cada vez e sem problemas.

// Isso removeu caracteres especiais + 0-9 e permite apenas letras (maiúsculas e minúsculas)

 function NoDoublesPls1() { var str=document.getElementById("NoDoubles1"); var regex=/[^az]/gi; str.value=str.value.replace(regex ,""); } 

// Isso removeu caracteres especiais e permite apenas letras (maiúsculas e minúsculas) e 0-9 E espaços

 function NoDoublesPls2() { var str=document.getElementById("NoDoubles2"); var regex=/[^az 0-9]/gi; str.value=str.value.replace(regex ,""); } 

// Isso removeu caracteres especiais e permite apenas letras (maiúsculas e minúsculas) e 0-9 E espaços // O .replace (/ \ s \ s + / g, “”) no final remove espaços excessivos // quando eu usou aspas simples, não funcionou.

 function NoDoublesPls3() { var str=document.getElementById("NoDoubles3"); var regex=/[^az 0-9]/gi; str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " "); } 

:: NEXT :: Salve # 3 como a .js // Liguei para o meu NoDoubles.js

:: NEXT :: Inclua seu JS em sua página

   

Inclua isso em seu campo de formulário: como

  

Para que fique assim

  

Isso removerá caracteres especiais, permitirá espaços únicos e removerá espaços extras.

Também uma possibilidade:

 str.replace( /\s+/g, ' ' ) 

Jquery tem a function trim () que basicamente transforma algo como “FOo Bar” em “FOo Bar”.

 var string = " My String with Multiple lines "; string.trim(); // output "My String with Multiple lines" 

É muito mais útil porque remove automaticamente os espaços vazios no início e no final da cadeia de caracteres. Não é necessário regex.

 var myregexp = new RegExp(/ {2,}/g); str = str.replace(myregexp,' '); 
 var string = "The dog has a long tail, and it is RED!"; var replaced = string.replace(/ +/g, " "); 

Ou se você também quiser replace as guias:

 var replaced = string.replace(/\s+/g, " "); 

Podemos usar o seguinte regex explicado com a ajuda do comando do sistema sed. O regex semelhante pode ser usado em outras linguagens e plataformas.

Adicione o texto em algum arquivo, diga teste

 manjeet-laptop:Desktop manjeet$ cat test "The dog has a long tail, and it is RED!" 

Podemos usar o seguinte regex para replace todos os espaços em branco por espaço único

 manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test "The dog has a long tail, and it is RED!" 

Espero que isso sirva ao propósito

Tente isso para replace vários espaços por um único espaço.

  

Leia mais @ Substituindo vários espaços por espaço único

 var text = `xxx df dfvdfv df dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' '); 

resultado:

 "xxx df dfvdfv df dfv"