2016-07-14 8 views
1

Guy Ich habe eine Liste der Zeichenfolge.Javascript Regex erhalten Liste der Zeichenfolge nicht in einfachen oder doppelten Anführungszeichen

Select 
id AS "cusId ", 
name as 'cusName', gendar as ' Gendar.', 
isPaid as " is'Paid ", total, remarks FROM 

brauche ich einen regulären Ausdruck, der zurückgibt:

Select 
id 
name 
gendar 
isPaid 
total 
remarks 
FROM 

Und auch Komma und 'AS' Stichwort ignorieren.

So weit von PHP kann ich preg_match_all('/(?<![\S"])([^"\'\s]+)(?![\S"])/') verwenden und alle Abfrage Schlüsselwörter später filtern, aber kam zu JavaScript gibt es keine Lookbehind in Regex.

+2

Warum 'Select-ID Name isPaid' und nicht' Select-ID Name Geschlecht isPaid'? Du solltest deine Anforderungen besser klären. – revo

+0

@revo sorry ich vermisse das – Tyler

+1

Ich denke, die Frage Formatierung war falsch. Wenn nicht, lass es uns wissen. Siehe [* Wie formatiere ich meine Posts mit Markdown oder HTML? *] (Http://stackoverflow.com/help/formatting). –

Antwort

2

DISCLAIMER: Die folgende Lösung ist keineswegs eine allgemeine Lösung zum Analysieren beliebiger SQL-Abfragen. Um beliebige SQL-Abfragen zu analysieren, müssen Sie eine vorhandene erstellen oder verwenden. Siehe auch How to parse/tokenize an SQL statement in Node.js.

So unter Berücksichtigung Ihre spezifischen Eingabezeichenfolgen, können Sie einen regulären Ausdruck verwenden, was Sie nicht brauchen, wird übereinstimmen, und dann erfassen, was Sie brauchen:

/"[^"]*"|'[^']*'|\s+AS\s+|\s*((?:(?!\sAS\s)[^,\s])+)/gi 

Siehe regex demo

Erklärung:

  • "[^"]*" - entspricht ein doppeltes Anführungszeichen String, der keine " innen hat (ersetzen mit "[^"\\]*(?:\\.[^"\\]*)*", wenn Sie unterstützen müssen entkommen " innen)
  • | - oder
  • '[^']*' - paßt einfache Anführungszeichen String keine ' innen mit (ersetzen mit '[^'\\]*(?:\\.[^'\\]*)*', wenn Sie unterstützen müssen entkommen ' innen)
  • | - oder
  • \s+AS\s+ - "AS" Wort innerhalb 1+ Leerzeichen
  • | - oder
  • \s* - 0+ Leerzeichen
  • ((?:(?!\sAS\s)[^,\s])+) - Gruppe 1 die Erfassung ein oder mehr andere Symbole als , und Leerzeichen (siehe [^,\s])+), die nicht mit einer Sequenz von einem Leerzeichen + + AS Leerzeichen beginnen. Es passt zu jedem Text, der nicht space + AS + space ist.

JS Demo:

var re = /"[^"]*"|'[^']*'|\s+AS\s+|\s*((?:(?!\sAS\s)[^,\s])+)/gi; 
 
var str = 'Select id AS "cusId ", name as \'cusName\', gendar as \' Gendar.\', isPaid as " is\'Paid " total , datetime FROM'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m[1]) { 
 
     res.push(m[1]); // Add the Capture group 1 to the resulting array 
 
    } 
 
} 
 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

+0

Ich habe die Quelle Ihrer Frage überprüft und es scheint, Sie müssen 'Select' und' id' getrennt bekommen, oder? Dann sollten Sie '[^,]' durch '[^, \ s]' ersetzen. Siehe https://regex101.com/r/eD8jR1/2 –

+0

wow, exzellent, Zeit, Regex wieder zu studieren, hoffentlich eines Tages werden Regex Master wie Sie:) danke dude – Tyler

+1

Sorry, aber brauchen Sie '[" Select ", "id", "name", "gendar", "isPaid", "gesamt", "datetime", "FROM"] 'mit der Eingabe wie' ID wählen AS "cusId", Name wie 'cusName', 'als' Gendar. ', IsPaid als "is'Paid" total, datetime FROM'? Ich denke du tust, ich habe die Antwort aktualisiert. –

Verwandte Themen