2015-05-19 9 views
6

Hallo, ich stolperte über ein Problem im Zusammenhang mit regulären Ausdrücken, die ich nicht lösen kann.Ein regulärer Javascript-Ausdruck, um die Abfrage zu token

Ich brauche die Abfrage (split-Abfrage in Teile) tokenize an, dass die folgenden ein als Beispiel:

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

Was ich brauche, schließlich ist eine Reihe von 7-Token haben:

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

Das siebte Token besteht aus mehreren Wörtern, da es sich in doppelten Anführungszeichen befand.

Meine Frage ist: Ist es möglich, die Eingabezeichenfolge entsprechend den obigen Erläuterungen unter Verwendung eines regulären Ausdrucks zu tokenisieren?

bearbeiten

Ich war neugierig Möglichkeit Regex.exec oder ähnlichen Code statt split verwenden, während das gleiche zu erreichen, also habe ich einige Untersuchungen haben, die von another question here folgte. Und so wie eine andere Antwort auf eine Frage kann eine folgende regex verwendet werden:

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

Mit dem folgenden Einzeiler Nutzungsszenario:

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

Hoffe, dass es nützlich sein wird ...

Antwort

5

können Sie diese Regex verwenden:

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""] 

Diese Regex auf Räume aufgeteilt werden, wenn die außerhalb doppelte Anführungszeichen sind ein Look-Ahead, indem Sie sicherstellen, gibt es gerade Anzahl von Zitaten nach Raum.

+1

Oh, ich habe versucht, die Werte statt Aufspalten der Zeichenfolge abfragen ... – Lu4

+0

Aber in diesem Fall müssen Sie doppelte Anführungszeichen um '„Es handelt sich um Verbindung Verbund Begriff“'. Ich dachte, du brauchst keine Zitate. –

+1

Das würde auch funktionieren, der Hauptpunkt ist die Leistung – Lu4

2

Sie können einen einfacheren Ansatz verwenden, um die Zeichenfolge und ergreifen Sie die Teilstrings in doppelte Anführungszeichen zu spalten und dann mit clean Funktion von leeren Array-Elemente loszuwerden:

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

Sie können Holen Sie sich alles, was zwischen einem Angebot und der nächsten ".*?" oder alles ist, was kein Leerzeichen ist \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'));

Verwandte Themen