2017-10-19 7 views
1

Pour savoir qui a soumis des requêtes SQL se terminent par une clause LIMIT, j'utilise l'expression rationnelle suivante:est là une expression régulière plus courte pour ce modèle

re_end_has_limit = re.compile(
    r'LIMIT\s+(\d+|\(\d+\)|\(\s+\d+\)|\(\s+\d+\s+\))($|;$|\s+;$|\s+;\s+$)', 
    re.IGNORECASE) 

Cela correspond à la & œuvres suivantes comme prévu. Il correspond à ce qui suit:

LIMIT 1 
LIMIT (1) 
LIMIT (1) 
LIMIT 1; 
LIMIT (1); 
LIMIT (1); 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 

Remarque: Les 3 dernières entrées contiennent un espace de fuite. Cependant, en regardant la regex, j'ai l'impression qu'il y a un moyen de l'écrire plus court mais je n'ai pas réussi à le comprendre.

+3

Vous voudrez peut-être en savoir plus sur '*' et '?'. De plus, votre expression régulière ne correspond pas 'LIMIT (1)'. – melpomene

+0

merci, après avoir appris à propos de '*', j'ai obtenu 'pattern = r'LIMIT (\ s + \ d + | \ s * \ (\ s * \ d + \ s * \)) \ s * (; \ s * $ | $) '', et après avoir appris '? 'j'ai atteint la réponse acceptée. –

Répondre

1

Que diriez-vous:

LIMIT(\s+\d+|\s*\(\s*\d+\s*\))\s*;?\s*$ 
-1

Je ne connais pas les requêtes SQL, mais regardant vos exemples, je pense que cela devrait fonctionner pour trouver toutes les clauses LIMIT:

re_end_has_limit = re.compile(r'LIMIT[ \(]+\d', re.g) 
+0

@melpomene: J'ai corrigé la réponse pour ne pas correspondre à votre nouvel exemple. – mrCarnivore

+0

Correspond à 'SELECT 'le SKY est la LIMITE (1 2 3)' FROM DUAL'. – melpomene

+0

J'abandonne ... Ces sortes de limitations n'étaient pas évidentes à partir de la question originale! Aussi les autres réponses ne fonctionnent pas non plus en les essayant sur regex101 ... – mrCarnivore

0

Ceci est également une option:

LIMIT\s*(\()?\s*\d+\s*(?(1)\))\s*;?\s*$ 

regex101

Au lieu d'utiliser ou (|), comme la réponse acceptée, il utilise if ((?(1)...).