2010-08-23 8 views
1

Je suis en train de construire une capacité de requête dsl-ish pratique dans mon javascript.javascript split chaîne sur plusieurs champs en utilisant regex

donné:

var query = "lastName = 'smith' and firstName = 'jack' or city = 'vancouver'"; 

ce qui est la façon la plus élégante de l'analyse syntaxique cette chaîne sql-esque en objets utilisables, tels que:

[ 
{ 
field:'lastName', 
operator:'=', 
value:'smith', 
join:'and' 
}, 
{ 
field:'firstName', 
operator:'=', 
value:'jack', 
join:'or' 
}, 
{ 
field:'city', 
operator:'=', 
value:'vancouver' 
} 
] 

Avant que je commence à boucle sans espoir pensé qu'il y aurait une regex maître qui avait un one-liner.

+1

Êtes-vous fou? lol :) – Topera

+0

Si vous interrogez à partir d'une base de données S'IL VOUS PLAÎT ne pas utiliser une regex. boucle et valide chaque élément avant de l'envoyer au backend. –

+0

Avez-vous des règles de préséance? (c'est-à-dire et avant ou) – Tmdean

Répondre

0

Créez une grammaire (EBNF ou BNF), puis écrivez-lui un analyseur. Non seulement vous aurez plus de cheveux sur la tête (vous finirez par arracher vos cheveux si vous essayez de le faire avec des expressions régulières!), Mais vous apprendrez quelque chose de nouveau et de cool :).

Si vous écrivez un analyseur récursif-descendant, vous pouvez facilement représenter votre requête en tant qu'arbre.

Voici un EBNF pour vous aider à démarrer:

query   ::= criterion { criterion } 
criterion  ::= boolean-operator { filter } 
boolean-operator ::= "not" | "or" | "and" 
filter   ::= variable, "=", value