2015-05-19 7 views
6

Salve Sono incappato in un problema relativo alle espressioni regolari che non riesco a risolvere.Un'espressione regolare javascript per tokenizzare la query

devo tokenize query (query diviso in parti), supponiamo il seguente come esempio:

These are the separate query elements "These are compound composite terms" 

Quello che casualmente serve è avere una matrice di 7 gettoni:

1) These 
2) are 
3) the 
4) separate 
5) query 
6) elements 
7) These are compound composite term 

Il settimo token è composto da più parole perché era racchiuso tra virgolette doppie.

La mia domanda è: E 'possibile tokenize la stringa di input di conseguenza per le spiegazioni di cui sopra utilizzando un'espressione regolare?

Modifica

mi incuriosiva possibilità di utilizzare Regex.exec o un codice simile al posto di split oltre a raggiungere la stessa cosa, così ho fatto un po 'di indagine che è stato seguito da another question here. E così come un'altra risposta ad una domanda di un seguente espressione regolare può essere utilizzato:

(?:")(?:\w+\W*)+(?:")|\w+ 

Con il seguente one-liner utilizzo scenario:

var tokens = query.match(/(?:")(?:\w+\W*)+(?:")|\w+/g); 

Spero che sarà utile ...

risposta

5

È possibile utilizzare questa espressione regolare:

var s = 'These are the separate query elements "These are compound composite term"'; 

var arr = s.split(/(?=(?:(?:[^"]*"){2})*[^"]*$)\s+/g); 
//=> ["These", "are", "the", "separate", "query", "elements", ""These are compound composite term""] 

Questa espressione regolare sarà diviso in spazi se queste sono le virgolette doppie esterne utilizzando un lookahead per assicurarsi che ci sono anche il numero di citazioni dopo che lo spazio.

+1

Oh, stavo cercando di interrogare i valori invece di dividere la stringa ... – Lu4

+0

Ma in questo caso, si ha tra virgolette intorno ' "Questi sono composti termine composito"'. Pensavo non avessi bisogno di virgolette. –

+1

Funzionerebbe anche, il punto principale è la prestazione – Lu4

2

È possibile utilizzare un approccio più semplice per dividere la stringa e afferrare le stringhe tra virgolette, e poi sbarazzarsi di elementi array vuoto con clean funzione:

Array.prototype.clean = function() { 
 
    for (var i = 0; i < this.length; i++) { 
 
    if (this[i] == undefined || this[i] == '') {   
 
     this.splice(i, 1); 
 
     i--; 
 
    } 
 
    } 
 
    return this; 
 
}; 
 

 
var re = /"(.*?)"|\s/g; 
 
var str = 'These are the separate query elements "These are compound composite term"'; 
 
var arr = str.split(re); 
 
alert(arr.clean());

2

Puoi ottenere tutto ciò che è tra un preventivo e il prossimo ".*?" o tutto ciò che non è uno spazio bianco \S+:

var re = /".*?"|\S+/g, 
 
    str = 'These are the separate query elements "These are compound composite term"', 
 
    m, 
 
    arr = []; 
 

 
while (m = re.exec(str)){ 
 
    arr.push(m[0]); 
 
} 
 
alert(arr.join('\n'));

Problemi correlati