2014-10-17 10 views
24

Vorrei dividere una stringa, ma vorrei mantenere lo spazio bianco come:JavaScript String split con lo spazio bianco

var str = "my car is red"; 

var stringArray []; 

stringArray [0] = "my"; 
stringArray [1] = " "; 
stringArray [2] = "car"; 
stringArray [3] = " "; 
stringArray [4] = "is"; 
stringArray [5] = " "; 
stringArray [6] = "red"; 

Come posso procedere per farlo?

Grazie!

risposta

26

È possibile dividere la stringa nello spazio bianco e quindi aggiungerla nuovamente, poiché si è a conoscenza di ognuna delle voci.

var string = "text to split"; 
    string = string.split(" "); 
var stringArray = new Array(); 
for(var i =0; i < string.length; i++){ 
    stringArray.push(string[i]); 
    if(i != string.length-1){ 
     stringArray.push(" "); 
    } 
} 

Aggiornamento: Rimosso trailing spazio.

+1

rimuovere Poi lo spazio finale. –

+0

Ah sì, davvero. – somethinghere

+0

perfetto, molte grazie! – Jose

38

Utilizzando espressioni regolari:

var str = "my car is red"; 
var stringArray = str.split(/(\s+)/); 

console.log(stringArray); // ["my", " ", "car", " ", "is", " ", "red"] 

\s corrisponde a qualsiasi carattere che è uno spazio bianco, aggiungendo il plus rende avidi, abbinando un gruppo a partire con i personaggi e termina con uno spazio, e il gruppo successivo inizia quando c'è un carattere dopo lo spazio bianco ecc.

+0

Huh, questo in realtà funziona. Puoi spiegare cosa sta facendo il 'filtro'? A prima vista sembra non essere valido poiché il callback 'filter' dovrebbe restituire' true' o 'false'. –

+2

Non hai davvero bisogno di quella funzione filtro ... –

6

È possibile dividere il limite della parola utilizzando \b. Vedi MDN

"\ b: corrisponde a un limite di parola di larghezza zero, ad esempio tra una lettera e uno spazio."

È inoltre necessario assicurarsi che sia seguito da uno spazio \s. in modo che le stringhe come "My car isn't red" funzionano ancora:

var stringArray = str.split(/\b(\s)/); 

L'iniziale \b è tenuta a prendere in considerazione spazi multipli, ad esempio my car is red

EDIT: Aggiunto raggruppamento

+2

Non lo suggerirei. '\ b' non * solo * corrisponde tra una lettera e uno spazio: ad esempio, corrisponde anche al confine tra lettere e punteggiatura. "L'e-mail di Bob è [email protected]" diventa "[" Bob "," '"," s "," "," e "," - "," mail "," "," is " , "", "a", "@", "b", ".", "com"] ' – Shai

+0

@Shai vero, aggiunto anche il controllo dello spazio – Rhumborl

0

Anche se questo non è supportato da tutti i browser, se si utilizza parentesi di cattura all'interno della vostra espressione regolare poi l'ingresso catturata viene impiombato nel risultato.

Se separatore è un'espressione regolare che contiene cattura parentesi, quindi ogni volta separatore è abbinata, i risultati (compresi quelli eventualmente undefined) dei sottogruppi sono suddivisi nell'array di uscita. [reference)

Quindi:

var stringArray = str.split(/(\s+)/); 
          ^^
// 

uscita:

["my", " ", "car", " ", "is", " ", "red"] 

Questo crolla spazi consecutivi in ​​ingresso originale, ma per il resto non riesco a pensare di eventuali insidie.

0
str.split(' ').join('§ §').split('§'); 
8

Per stringa divisa da spazio come in Python Lang, possono essere utilizzati:

var w = "hello my borthers ;"; 
    w.split(/(\s+)/).filter(function(e) { return e.trim().length > 0; }); 

uscita:

["hello", "my", "borthers", ";"]