Expression régulière sous oracle, pl / sql

Résolu/Fermé
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 - 2 oct. 2018 à 15:24
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 - 3 oct. 2018 à 09:47
Bonjour

je veux faire une condition sur une sélection de mes données, je veux sélectionner les données qui respectent les contraintes suivantes:



- Uniquement des caractères suivants : [a .. z] + [A .. Z] + [0 .. 9] +[ _ ]

- Avec les restrictions suivantes :

•ne pas dépasser 128 caractères
•ne doit pas commencer par un chiffre
•ne peut avoir plusieurs caractères "blanc souligné" de suite
•le nom ne doit pas être un mot réservé de SQL

=> Autrement dit, les lettres accentuées (é à ù ï É ...), les "kanas" (ç œ ...), les caractères de ponctuation (, ; : ! ? ...) et autres caractères spéciaux, comme le blanc, sont proscrits.


j'ai commencé à le faire :


REGEXP_LIKE (COL_NOM_SQL, '^([a-z]*|[ _ ]' ...);


et après je me bloque !

si quelqu’un peut m'aider ou me filer un lien pour traduire mon texte en expression je serai reconnaissante

Je vous remercie

1 réponse

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
2 oct. 2018 à 16:29
Bonjour,

En une seule expression rationnelle, ça peut être un peu compliqué, et pas facile à maintenir.
Par contre, comme si je l'imagine, tu es dans une clause WHERE, tu peux faire plusieurs expressions reliées par des AND. Cela pourrait avoir un coût en termes de performances, à toi de voir si c'est rédhibitoire.
L'avantage également, c'est de pouvoir utiliser NOT, pour les restrictions.

En décomposant dans le même ordre que tes points :
WHERE REGEXP_LIKE (COL_NOM_SQL, '^[a-zA-Z0-9_]*$')
    AND NOT REGEXP_LIKE (COL_NOM_SQL, '.{129}')
    AND NOT REGEXP_LIKE (COL_NOM_SQL, '^[0-9]')
    AND COL_NOM_SQL NOT LIKE  '%__%'
    AND COL_NOM_SQL NOT IN ('SELECT', 'WHERE')...

Pour la taille max, il y a sûrement une fonction plus simple que par expression rationnelle.
Pour les mots réservés SQL, je ne sais pas s'il y a une liste directement accessible en PL/SQL, et il faudrait aussi tester en passant la colonne en majuscules pour se départir des différences de casse.
1
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
Modifié le 3 oct. 2018 à 09:51
Bonjour Reivax et merci pour ta réponse ,

exactement je suis dans le WHERE , et j'ai fais plusieurs conditions sur 3 lignes , dans une seule regx ce n'est pas evident ! donc voici ce que j'ai fais

 
[du code ]
where [...]

AND NOT EXISTS (SELECT 1 FROM V$RESERVED_WORDS WHERE COL_NOM_SQL = KEYWORD) -- ca c pour les mot reservés au SQL ca marche !

AND REGEXP_LIKE COL_NOM_SQL , '^[A-z_][A-z0-9_]{1,128}'))  -- ca c est pour qu'il commence par une lettreou '_'  et pas un nombre ou autre chose et ca marche aussi

AND COL_NOM_SQL NOT LIKE  '%__%'  --  => mais ca en fait je ne suis pas sure car il va accepté le mot suivant : 'TOTO____TOTO'  quiest interdit : ( ne peut avoir plusieurs caractères 'blanc souligné' de suite)
...



Merci encore :)
0