OVH Cloud OVH Cloud

Prb Match RegEx

3 réponses
Avatar
Horizon
Bonjour,

Je voudrais construire une regex qui puisse me retourner la liste des tables
d'une requete SQL SELECT.

Par ex :
-SELECT * FROM tab1, tab2, tab3
-SELECT * FROM tab1, tab2 WHERE col="abc"
-SELECT * FROM tab1, tab2 LIMIT 1

J'ai essayé quelque chose comme ca :
---
Regex pattern1 = new
Regex(@"FROM\s+(?<tabname>.*)(WHERE|LIMIT|ORDER|HAVING|GROUP)?",
RegexOptions.IgnoreCase );
Match match1 = pattern1.Match(request);
if( match1.Success )
string res = match1.Groups["tabname"].Value;
---
Mais à chaque fois, dans tabname, j'ai toute la string jusqu'à la fin de la
chaine (ex : tab1, tab2 LIMIT 1) au lieu de (tab1, tab2)



Merci pour votre aide

3 réponses

Avatar
Ambassadeur Kosh
eh oui, c'est pas ce qu'on croit :)

résolu de maniere violente, c'est ça :

FROM (?<tabs>.*) (WHERE|LIMIT|ORDER|HAVING|GROUP) .*$ | FROM (?<tabs>.*) .*$

mais tu peux carrement faire mieux

^SELECT s* [*] s* FROM s+ (?<table>w+)(s*,s*(?<table>w+))* .* $

c'est pas beau la vie ? y'a qu'a secouer les matches pour recuperer les noms
de tables un par un
Avatar
Horizon
Oui ça marche, merci beaucoup pour ta réponse :)

Voila également une autre solution qu'on m'a donnée, ça peut toujours servir
:
FROMs+(?<tabname>.*?)(WHERE|LIMIT|ORDER|HAVING|GROUP|$)

Horizon
Avatar
Ambassadeur Kosh
> FROMs+(?<tabname>.*?)(WHERE|LIMIT|ORDER|HAVING|GROUP|$)



je ne pensais pas qu'on pouvait factoriser de cette façon.
merci du tuyau