Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Difficile avec les expressions regulaires !

4 réponses
Avatar
Utilisateur1
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.. }

4 réponses

Avatar
Bruno Desthuilliers
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.
Avatar
Olivier Miakinen
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
Avatar
Mickael Wolff
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
Avatar
Bruno Desthuilliers
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 !-)