Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Difficile avec les expressions regulaires !

0 views
Skip to first unread message

Utilisateur1

unread,
Oct 22, 2009, 2:21:19 AM10/22/09
to
a.. J'ai de gros problemes pour faire fonctionner ces deux expressions
r�gulaires.

Je veux identifier deux types de requ�tes sql simples diff�rentes que je
peux recevoir, pour effectuer un traitement diff�rent avant d'envoyer la
requ�te au sgbd.
Dans les deux cas � tester, j'ai toujours "INCONNU" comme r�sultat.

J'ai bien utilis� i � la fin pour ne pas avoir de probl�mes pour les
majuscules et minuscules, et j'ai essay� avec et sans, meme probleme.
[\ ]{0,} sert pour ne pas rater une requete si elle contient un espace en
plus entre deux parties de la requete.

Ou est l'erreur ?

Merci de votre assistance !

voici le code

// Premiere chaine � savoir intercepter
//$SQLRequete ="SELECT CURRVAL('seq_montruc_id')";

// Deuxieme chaine a savoir intercepter
a.. $Chaine ="SELECT mavaleur FROM matable WHERE lechamp = 1234";
a..
a..


IF(preg_match('/^(SELECT){1}[\ ]{0,}(CURRVAL\(\'){1}([a-zA-Z]+)(\'\)){1}$/i'
, $Chaine)==1)
a.. {
a.. echo('CURRVAL');
a.. }
a.. elseif(preg_match('/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}
(FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
[\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i', $Chaine)==1)
a.. {
a.. echo('SELECT FROM ');
a.. }
a.. else
a.. {
a.. echo('INCONNU');
a.. }

Bruno Desthuilliers

unread,
Oct 22, 2009, 5:14:32 AM10/22/09
to
Utilisateur1 a �crit :

> a.. J'ai de gros problemes pour faire fonctionner ces deux expressions
> r�gulaires.

Pour les �crire, d�j�...

> Je veux identifier deux types de requ�tes sql simples diff�rentes que je
> peux recevoir, pour effectuer un traitement diff�rent avant d'envoyer la
> requ�te au sgbd.
> Dans les deux cas � tester, j'ai toujours "INCONNU" comme r�sultat.
>
> J'ai bien utilis� i � la fin pour ne pas avoir de probl�mes pour les
> majuscules et minuscules, et j'ai essay� avec et sans, meme probleme.
> [\ ]{0,} sert pour ne pas rater une requete si elle contient un espace en
> plus entre deux parties de la requete.
>
> Ou est l'erreur ?

Mauvaise lecture de la doc et complexification inutile.

> voici le code
>
> // Premiere chaine � savoir intercepter

> "SELECT CURRVAL('seq_montruc_id')";


>
>
> '/^(SELECT){1}[\ ]{0,}(CURRVAL\(\'){1}([a-zA-Z]+)(\'\)){1}$/i'

tu te fatigues bien la vie, l�... D�j�, vire tout le bordel inutile. Et
pense que si la requ�te est g�n�r�e par code, elle peut avoir des
espaces (sauts de lignes inclus) un peu partout.

"/^ *SELECT +CURRVAL *\( *'([a-zA-Z_]+)' *\) *$/i"


> // Deuxieme chaine a savoir intercepter

> "SELECT mavaleur FROM matable WHERE lechamp = 1234";

> '/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}


> (FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
> [\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i'

Urg....

"/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
*([0-9]+) *$/i"


NB : Pas test�, mais �a devrait te remettre sur le bon chemin. Petits
rappels au passage:

- un litt�ral matche ce m�me litt�ral. Donc, "[=]" est une fa�on
inutilement compliqu�e d'�crire "=" (idem pour les espaces...)
- le quantifieur par d�faut est "{1,1}". Donc, "^(SELECT){1} " est une
fa�on inutilement compliqu�e d'�crire "^SELECT "
- "{0,}" s'�crit plus simplement "*"
- "{1,}" s'�crit plus simplement "+"
- "{0,1}" s'�crit plus simplenent "?"

D'une mani�re g�n�rale, n'utilise les quantifieurs complexes ("{,}") que
si tu en a vraiment besoin. Idem pour les groupements (parenth�ses) et
les classes ("[...]").

Accessoirement, en utilisant des doubles quotes pour d�finir ton
expression, tu n'a pas besoin d'�chapper les simples quotes, ce qui
am�liore quelque peu la lisibilit�.

Autre point: tu ne pr�cises pas le contexte d'utilisation, mais sauf si
tu a la main sur le code qui _g�n�re_ les requ�tes, parser du SQL �
coups de regexps est assez casse-gueule. Particuli�rement sur des
requ�tes SELECT. Je peux te donner quelques examples simples de SELECT
que ta regexp ne capturera pas:

SELECT * FROM ma_table WHERE mon_champ = 123;
SELECT champ1, champ2 FROM ma_table WHERE mon_champ = 123;
SELECT champ1 as tutu FROM ma_table WHERE mon_champ = 123;
SELECT ma_table.champ1 FROM ma_table WHERE ma_table.mon_champ = 123;

et je n'ai fait qu'effleurer la surface de l'iceberg - je pourrais t'en
tartiner des pages et des pages.

Olivier Miakinen

unread,
Oct 22, 2009, 5:37:21 AM10/22/09
to
Le 22/10/2009 11:14, Bruno Desthuilliers rᅵpondait ᅵ Utilisateur1 :

>
>> a.. J'ai de gros problemes pour faire fonctionner ces deux expressions
>> rᅵgulaires.
>
> Pour les ᅵcrire, dᅵjᅵ...

Moi j'aime bien le mot ᅵ rᅵgulaires ᅵ qui devrait mettre d'accord
(contre lui ?) aussi bien les tenants de ᅵ rᅵguliᅵres ᅵ que ceux de
ᅵ rationnelles ᅵ. ;-)

> [...]
>
> tu te fatigues bien la vie, lᅵ... Dᅵjᅵ, vire tout le bordel inutile. Et
> pense que si la requᅵte est gᅵnᅵrᅵe par code, elle peut avoir des

> espaces (sauts de lignes inclus) un peu partout.
>
> "/^ *SELECT +CURRVAL *\( *'([a-zA-Z_]+)' *\) *$/i"

Note qu'ici tu ne traites que les espaces, pas les tabulations ou les
sauts de ligne... Mais comme tu le dis plus loin il y a plein d'autres
cas qui ne sont pas forcᅵment traitᅵs non plus.

> [...]


>
>> '/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}
>> (FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
>> [\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i'
>
> Urg....

:-D

> "/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
> *([0-9]+) *$/i"

Pour aller jusqu'au bout de la logique des espaces multiples, il manque
un '+' aprᅵs 'WHERE '.

> NB : Pas testᅵ, mais ᅵa devrait te remettre sur le bon chemin. Petits
> rappels au passage:
>
> [...]

Oui, c'ᅵtait une bonne idᅵe de les faire. Je rappelle pour ma part que
le groupe fr.comp.lang.regexp accueillera avec bienveillance toute
question sur les expressions rᅵgulaires (dᅵcidᅵment, ce terme me plaᅵt).

> Autre point: tu ne prᅵcises pas le contexte d'utilisation, mais sauf si
> tu as la main sur le code qui _gᅵnᅵre_ les requᅵtes, parser du SQL ᅵ
> coups de regexps est assez casse-gueule. [...] je pourrais t'en


> tartiner des pages et des pages.

[OUI]


Cordialement,
--
Olivier Miakinen

Mickael Wolff

unread,
Oct 22, 2009, 6:07:53 AM10/22/09
to
Utilisateur1 wrote:
> Je veux identifier deux types de requ�tes sql simples diff�rentes que je
> peux recevoir, pour effectuer un traitement diff�rent avant d'envoyer la
> requ�te au sgbd.
> Dans les deux cas � tester, j'ai toujours "INCONNU" comme r�sultat.

Je ne reviendrais pas sur les regex, Bruno a largement point� tes
maladresses. Par contre, il serait int�ressant d'expliquer ton besoin.
L'usage des regex n'est certainement pas une bonne id�e ici.

--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org

Bruno Desthuilliers

unread,
Oct 22, 2009, 12:37:58 PM10/22/09
to
Olivier Miakinen a ᅵcrit :

> Le 22/10/2009 11:14, Bruno Desthuilliers rᅵpondait ᅵ Utilisateur1 :
(snip)

>> "/^ *SELECT +CURRVAL *\( *'([a-zA-Z_]+)' *\) *$/i"
>
> Note qu'ici tu ne traites que les espaces, pas les tabulations ou les
> sauts de ligne...

yeps - je voulais y revenir mais j'ai oubliᅵ :(

>> "/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
>> *([0-9]+) *$/i"
>
> Pour aller jusqu'au bout de la logique des espaces multiples, il manque
> un '+' aprᅵs 'WHERE '.

Bien vu - merci pour les corrections !-)

0 new messages