2012-02-22 29 views
8

Necesito un tokenizador que al darle una cadena con un espacio en blanco arbitrario entre las palabras creará una matriz de palabras sin subcadenas vacías.¿Dividir una cadena usando espacios en blanco en Javascript?

Por ejemplo, dada una cadena:

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

que utilizo:

str2.split(" ") 

Aquí también se devuelve vacías sub-cadenas:

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

Cómo filtrar las cadenas vacías de ¿una matriz?

Respuesta

15

Es probable que ni siquiera es necesario filtrar, simplemente separa usando este Expresión regular:

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

fuera de tema: ¿qué significa '\ b' en expresiones regulares? –

+3

Coincide con un límite de palabras, como un espacio, un carácter de nueva línea, un carácter de puntuación o un final de cadena (https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions). Puede que no sea la Regex perfecta, pero para ese ejemplo, funciona. – Daff

+0

@Mustafa, sí, lo sé. Pero es solo una curiosidad. –

7

Usted debe recortar la cadena antes de usar dividida.

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

recomiendo .match:

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

Esto coincide con palabras entre los límites de palabra, por lo que todos los espacios no coinciden y por lo tanto no se incluyen en la matriz resultante.

+0

Esto funciona aún mejor: >>> str2 "Humpty Dumpty sonrió desdeñosamente Por supuesto que no-hasta que te digo que quería decir que hay un buen ¡argumento derribado para ti! " Usando: str3 = str2.coincidencia (/ \ b \ w + \ b/g); Resultados en: >>> str3 ["Humpty", "Dumpty", "sonrió", "despectivamente", "De", "curso", "usted", "no", "hasta", " I "," decir "," usted "," yo "," querido "," hay "," a "," agradable "," tocar "," abajo "," argumento "," para "," usted " ] Entonces w + también coincide "-" – dokondr

+1

@dokondr: ¿Qué cuentas como personajes de palabras? Si se trata de todo, excepto espacios, es posible que desee utilizar '[^]' en lugar de '\ w'. – pimvdb

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

devuelve una lista de secuencias no espaciales ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said."]

str.match(/\w+/g) 

devuelve una lista de todas las palabras (tenga en cuenta que esto incluye el punto en "dicho".): ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said"]

docs en match()

+1

Buena respuesta. Para referencia de otros, las coincidencias '/ S + /' contra grupos de caracteres que son ** no ** espacios en blanco, mientras que '/ w + /' coincide con grupos de caracteres que ** son ** alfanuméricos + guión bajo. Es por eso que el carácter de punto ('.') coincide en uno pero no en el otro. –

0

creo que la subcadena vacía ocurre porque hay múltiples espacios en blanco que puede usar un replace() en un ciclo for para reemplazar multiple wh ite-espacios con un solo espacio en blanco a continuación, split() para dividir el programa usando un solo espacio en blanco así:

// 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(" ");

Cuestiones relacionadas