2010-05-12 14 views

risposta

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

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

questo sembra dividere in "." e '-' così come gli spazi. Questo dovrebbe probabilmente essere 'str.match (/ \ S + |" [^ "] +"/g) ' – Awalias

+0

C'è un altro problema con questo, se deve gestire le virgolette con escaping. Ad esempio: ' 'singole parole "risolto stringa di \ "quoted \" words "'' Anche con la correzione di Awalias, questo dà: '[" singolo "," parole "," "fisso", "stringa", "" di "," parole ""] ' Avresti bisogno di gestire le virgolette con escape, ma non di inciampare e afferrare e far uscire la barra rovesciata. Penso che alla fine diventerà più complicato di quello che vorresti veramente gestire con un'espressione regolare. – jep

+0

@Awalias Ho una risposta migliore qui sotto. Il tuo esempio di espressione regolare dovrebbe essere/[^ \ s "] + |" ([^ "] *)"/g. Il tuo sarà ancora diviso in spazi in aree quotate. Ho aggiunto una risposta che risolve questo problema e rimuove le virgolette dai risultati come richiesto dall'OP. – dallin

9

Questo utilizza un mix di suddivisione e regex matching.

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, "")); 
    } 
} 

Questo restituisce il risultato previsto, anche se una singola espressione regolare dovrebbe essere in grado di eseguire tutto.

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

Aggiornamento e questa è la versione migliorata del metodo proposto da S. Marco

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

grazie, vado per la versione migliorata – Remi

+0

C'è un problema con la versione migliorata, dove se usi un carattere non di parole come "#" scomparirà. – tuhoojabotti

+0

Questa è una buona risposta, ma se si desidera eseguire tutto tramite espressioni regolari e rimuovere le virgolette, ho aggiunto una nuova risposta che esegue questa operazione e non richiede il looping di ogni risultato per rimuovere le virgolette in seguito. – dallin

0

ho notato i personaggi scompaiono, anche. Penso che puoi includerli - per esempio, per includere "+" con la parola, usa qualcosa come "[\ w \ +]" invece di "\ w".

13

La risposta accettata non è del tutto corretta. Si separa su personaggi non spaziali come. e - e lascia le virgolette nei risultati. Il modo migliore per farlo in modo tale che esso esclude le quotazioni è con gruppi di cattura, come ad esempio:

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

myArray ora conterrà esattamente ciò che il PO ha chiesto:

single,words,fixed string of words 
+0

Funziona bene, grazie. Solo per dire che l'opzione "i" sembra essere ridondante. –

1

ES6 soluzione supporto:

  • Split dallo spazio, tranne per la parte interna cita
  • citazioni rimozione, ma non per le citazioni fuggiti backslash
  • citazione diventare citazione
  • può mettere le virgolette escape ovunque

Codice:

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 

uscita:

[ 'single', 'words', 'fixed string of words' ] 
Problemi correlati