Sostituisci più spazi bianchi con un singolo spazio bianco nella stringa JavaScript


191

Ho delle stringhe con spazi bianchi extra, ogni volta che c'è più di un solo spazio bianco mi piacerebbe che fosse solo uno.

Chiunque? Ho provato a cercare su Google, ma niente ha funzionato per me.

Grazie


2
rimuovere gli spazi bianchi duplicati dalla fine / inizio o in qualsiasi parte del testo?
ninjagecko,

Risposte:


371

Qualcosa come questo:

var s = "  a  b     c  ";

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


31
@Me Per favore leggi attentamente la domanda: "ogni volta che c'è più di un solo spazio bianco, vorrei che fosse solo uno".
bjornd,

5
Non è ovvio? sostituisce più di 1 carattere spazio bianco con 1 carattere spazio bianco. (il risultato desiderato)
Guerra

4
@CiaranG È un'espressione regolare
pomeroy,

1
@Wardy, close :-). Sostituisce uno o più con uno spazio (ma in effetti, il risultato desiderato).
Greenoldman,

1
Cosa succede se si desidera sostituire 1+ spazi bianchi con lo stesso tipo di spazi bianchi? (ad es. 2+ spazi con uno spazio e 3 nuove righe con una nuova riga, ecc.) se sono presenti sia nuove righe che spazi, è necessario sostituirli con una nuova riga, mentre in presenza di spazi e schede dovrebbe essere sostituito da un spazio
Tom,

61

Puoi aumentare String per implementare questi comportamenti come metodi, come in:

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

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

Ciò ora consente di utilizzare le seguenti forme eleganti per produrre le stringhe desiderate:

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

14
L'aumento del prototipo dell'oggetto standard è un modello davvero controverso. Non lo consiglierei per una domanda così basilare.
bjornd,

@XavierJohn È String, con una R, non Sting.
Lasagna Android

20

usare un'espressione regolare con la funzione di sostituzione fa il trucco:

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

Questa soluzione è errata per la domanda. E mi chiedo davvero perché l'hai pubblicato due giorni dopo che è stata pubblicata una soluzione migliore ...
Sebastian Mach

Penso che all'epoca solo questo codice funzionasse per me. Non posso tornare indietro per confermare. Ovviamente avrei provato prima la soluzione migliore. Inoltre, dopo averlo verificato nella console di Chrome, entrambe le soluzioni sembravano funzionare. È interessante notare che, quando ho copiato il risultato in questa casella di commento, ha mostrato che la mia soluzione non funzionava per più spazi bianchi. Forse puoi aiutarmi a capire il perché. Immagino sia un errore di Chrome? Prova a eseguire il mio codice nella console di Chrome e fammi sapere.
Roger Gajraj,

13

Ecco una soluzione non regex (solo per divertimento):

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"

Divide la stringa per spazi bianchi , rimuove tutti gli elementi dell'array vuoti dall'array (quelli che erano più di un singolo spazio) e unisce nuovamente tutte le parole in una stringa, con un singolo spazio bianco tra di loro.


12

Presumo che tu stia cercando di eliminare gli spazi dall'inizio e / o alla fine della stringa (piuttosto che rimuovere tutti gli spazi?

In tal caso, avrai bisogno di una regex come questa:

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

Ciò rimuoverà tutti gli spazi dall'inizio o dalla fine della stringa. Se vuoi solo tagliare gli spazi dalla fine, allora la regex sarebbe simile a questa:

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

Spero che aiuti.


4
Mi piace la semplicità del tuo regex, @Spudley, ma il tuo codice non sostituirà le esecuzioni di spazi bianchi all'inizio e alla fine con un singolo carattere spaziale? Pensavo che l'obiettivo fosse quello di rimuovere completamente lo spazio bianco dalle estremità, nel qual caso la stringa di sostituzione dovrebbe essere ''invece di ' '.
Randall Cook,


6

So che non dovrei negromanzia su un argomento, ma dati i dettagli della domanda, di solito lo espanderò per significare:

  • Voglio sostituire più ricorrenze di spazi bianchi all'interno della stringa con un singolo spazio
  • ... e ... Non voglio spazi bianchi all'inizio o alla fine della stringa (trim)

Per questo, uso un codice come questo (le parentesi sul primo regexp sono lì solo per rendere il codice un po 'più leggibile ... regexps può essere un dolore a meno che tu non ne abbia familiarità):

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

Il motivo per cui funziona è che i metodi su String-object restituiscono un oggetto stringa su cui è possibile invocare un altro metodo (proprio come jQuery e alcune altre librerie). Modo molto più compatto per codificare se si desidera eseguire più metodi su un singolo oggetto in successione.


+1 per l'esempio "pronto per l'uso". Avevo intenzione di pubblicarlo da solo
d.raev

ESATTAMENTE quello che stavo cercando, fantastico!
robertp,

4

var x = "Test Test Test" .split ("") .join (""); alert (x);


5
Funziona ma non è una codifica intelligente. Questo codice è più lento di un RegEx. Mi chiedo se Split () non usa RegEx per dividere una stringa!
Farandole,

2

Prova questo.

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

il risultato sarà

string 1

Quello che è successo qui è che taglierà prima gli spazi esterni usando trim()poi taglierà gli spazi interni usando .replace(/\s+/g, ' ').


0

Se si desidera limitare l'utente a dare spazio nel nome, basta creare un'istruzione if e fornire la condizione. come ho fatto:

$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;
        }
    }
});
  • creare una funzione JQuery.
  • questo è un evento di pressione dei tasti.
  • Inizializza una variabile.
  • Dare la condizione per abbinare il personaggio
  • mostra un messaggio di avviso per la tua condizione abbinata.

0

Che ne dici di questo?

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

uscite "my test string with crazy stuff is cool "

Questo si sbarazza anche di tutte le schede


Le schede sono già coperte da \s. Regex inutilmente complesso, potrebbe anche solo scrivere /\s+/g.
Anders Rabo Thorbeck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.