2010-05-12 7 views

Respuesta

25
str.match(/\w+|"[^"]+"/g) 

//single, words, "fixed string of words" 
+3

esto parece dividir en '.' y '-' además de espacios. Esto probablemente debería ser 'str.match (/ \ s + | "[^"] +"/g) ' – Awalias

+0

Hay otro problema con esto, si tiene que manejar cotizaciones escapado Por ejemplo:. ' 'una sola palabra "fijo cadena de \ "palabras citadas \" '' ' Incluso con la corrección de Awalias, esto da: '[" solo "," palabras "," "fijo", "cadena", "" de "," palabras ""] ' que había necesidad de manejar cotizaciones escapado, pero se dispara hacia arriba y agarrar y escaparon barra invertida. Creo que eventualmente se volvería más complicado de lo que realmente quisieras manejar con una expresión regular. – jep

+0

@Awalias Tengo una mejor respuesta a continuación. Su ejemplo de expresiones regulares debería ser/[^ \ s "] + |" ([^ "] *)"/g. El tuyo aún se dividirá en espacios en áreas cotizadas. Agregué una respuesta que corrige esto y quita las comillas de los resultados como pidió el OP. – dallin

9

Esto usa una mezcla de coincidencia de división y de expresión regular.

var str = 'single words "fixed string of words"'; 
var matches = /".+?"/.exec(str); 
str = str.replace(/".+?"/, "").replace(/^\s+|\s+$/g, ""); 
var astr = str.split(" "); 
if (matches) { 
    for (var i = 0; i < matches.length; i++) { 
     astr.push(matches[i].replace(/"/g, "")); 
    } 
} 

Esto devuelve el resultado esperado, aunque una sola expresión regular debería ser capaz de hacerlo todo.

// ["single", "words", "fixed string of words"] 

actualización Y esta es la versión mejorada del método propuesto por S.Mark

var str = 'single words "fixed string of words"'; 
var aStr = str.match(/\w+|"[^"]+"/g), i = aStr.length; 
while(i--){ 
    aStr[i] = aStr[i].replace(/"/g,""); 
} 
// ["single", "words", "fixed string of words"] 
+0

gracias, voy por la versión mejorada – Remi

+0

Hay un problema con la versión mejorada, donde si usa un carácter que no sea de palabra como "#", desaparecerá. – tuhoojabotti

+0

Esta es una buena respuesta, pero si quiere hacerlo todo a través de expresiones regulares y quitar las comillas, agregué una nueva respuesta que hace esto y no es necesario pasar por todos los resultados para quitar las comillas después. – dallin

0

Noté que desaparecen los personajes, también. Creo que se puede incluirlos - por ejemplo, tener que incluir "+" con la palabra, usar algo como "[\ w \ +]" en lugar de simplemente "\ w".

13

La respuesta aceptada no es del todo correcto. Se separa en caracteres no espaciales como. y - y deja las citas en los resultados. La mejor manera de hacer esto por lo que excluye las comillas es con los grupos de captura, como por ejemplo:

//The parenthesis in the regex creates a captured group within the quotes 
var myRegexp = /[^\s"]+|"([^"]*)"/gi; 
var myString = 'single words "fixed string of words"'; 
var myArray = []; 

do { 
    //Each call to exec returns the next regex match as an array 
    var match = myRegexp.exec(myString); 
    if (match != null) 
    { 
     //Index 1 in the array is the captured group if it exists 
     //Index 0 is the matched text, which we use if no captured group exists 
     myArray.push(match[1] ? match[1] : match[0]); 
    } 
} while (match != null); 

miMatriz ahora contendrá exactamente lo que pidió el PO:

single,words,fixed string of words 
+0

Funciona bien, gracias. Solo para decir que el interruptor 'i' parece ser redundante. –

1

ES6 solución de soporte:

  • dividida por el espacio a excepción de comillas
  • cotizaciones de Extracción pero no para la barra invertida cotizaciones escapado
  • escapados de cotización convertido en la cita
  • puede poner comillas en cualquier lugar

Código:

str.match(/\\?.|^$/g).reduce((p, c) => { 
     if(c === '"'){ 
      p.quote ^= 1; 
     }else if(!p.quote && c === ' '){ 
      p.a.push(''); 
     }else{ 
      p.a[p.a.length-1] += c.replace(/\\(.)/,"$1"); 
     } 
     return p; 
    }, {a: ['']}).a 

de salida:

[ 'single', 'words', 'fixed string of words' ] 
Cuestiones relacionadas