2012-02-22 16 views
8

Ho bisogno di un tokenizer che abbia una stringa con uno spazio bianco arbitrario tra le parole creerà un array di parole senza sottostringhe vuote.Dividere una stringa usando spazi bianchi in Javascript?

Ad esempio, data una stringa:

" I dont know what you mean by glory Alice said." 

io uso:

str2.split(" ") 

Ciò restituisce anche vuoti sotto-stringhe:

["", "I", "dont", "know", "what", "you", "mean", "by", "glory", "", "Alice", "said."] 

Come filtrare le stringhe vuote da un array?

risposta

15

Probabilmente non c'è nemmeno bisogno di filtrare, appena rotto con questa espressione regolare:

" I dont know what you mean by glory Alice said.".split(/\b\s+/) 
+0

Off-topic: cosa significa '\ b' in regex? –

+3

Corrisponde a un limite di parola, ad esempio uno spazio, un carattere di fine riga, un carattere di punteggiatura o una fine di stringa (https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions). Potrebbe non essere il Regex perfetto ma per quell'esempio funziona. – Daff

+0

@Mustafa si, lo so. Ma è solo una curiosità. –

7

Si dovrebbe tagliare la corda prima di utilizzare scissione.

var str = " I dont know what you mean by glory Alice said." 
var trimmed = str.replace(/^\s+|\s+$/g, ''); 
trimmed = str.split(" ") 
2

vi consiglio .match:

str.match(/\b\w+\b/g); 

Questo corrisponde parole tra confini di parola, in modo che tutti gli spazi non sono abbinati e quindi non inclusi nella matrice risultante.

+0

Funziona ancora meglio: >>> str2 "Humpty Dumpty sorrideva sprezzante Certo che tu non-fino a dirti che intendevo c'è un bel argomento knock-down per te! " Utilizzo: str3 = str2.partita (/ \ b \ w + \ b/g); Risultati in: >>> str3 ["Humpty", "Dumpty", "sorrise", "sdegnosamente", "Of", "course", "you", "dont", "till", " I "," tell "," you "," I "," significato "," theres "," a "," nice "," knock "," down "," argument "," for "," you " ] Quindi w + corrisponde anche a "-" – dokondr

+1

@dokondr: cosa contate come caratteri parola? Se è tutto tranne gli spazi, potresti voler usare '[^]' invece di '\ w'. – pimvdb

7
str.match(/\S+/g) 

restituisce una lista di sequenze non spaziali ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said."]

str.match(/\w+/g) 

restituisce un elenco di tutte le parole (si noti che questo include il punto in "ha detto."): ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said"]

Docs match()

+1

Buona risposta. Per riferimento ad altri, '/ S + /' corrisponde ai gruppi di caratteri che sono ** non ** spazi bianchi, mentre '/ w + /' corrisponde a gruppi di caratteri che ** sono ** alfanumerici + underscore. Questo è il motivo per cui il punto ('.') corrisponde a uno ma non all'altro. –

0

penso che la sottostringa vuota si verifichi perché ci sono più spazi bianchi è possibile utilizzare un replace() in un ciclo for per sostituire più wh ite-spazi con un singolo white-space poi split() per dividere il programma utilizzando un unico spazio bianco come questo:

// getting full program from div 
 
var program = document.getElementById("ans").textContent; 
 
//removing multiple spaces 
 
var res = program.replace(" ", " "); 
 
for (i = 0; i <= program.length; i++) { 
 
    var res = res.replace(" ", " "); 
 
} 
 
// spliting each word using space as saperator 
 
var result = res.split(" ");

Problemi correlati