REGEXP recherche sur libéllé

REGEXP recherche sur libéllé - SQL/NoSQL - Programmation

Marsh Posté le 06-11-2013 à 15:34:13    

bonjour à tous,
 
Depuis peu j'essaye de créer un expression régulière en SQL mais je m'y prend assez mal et cela ne fonctionne pas.
 
J'aimerai rechercher sur une un champ de type varchar, toute les occurrences ayant ayant au moins un caractère interdit. Ici les caractère interdits sont les caractères différents de ceux autorisés:
 
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w",
"x","y","z"
,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"
,"0","1","2","3","4","5","6","7","8","9","/","-","?",":","("," )",".",
",","’","+"
 
J'ai bien essayé de faire cela avec INTERSECT, mais mon tablespace est trop petit pour pouvoir exécuter cette requête.
 
J'ai donc penser aux expressions régulière, mais je ne capte pas grand chose à cela. Pour avoir des caractère uniquement alphanumérique ainsi que des espace j'ai fait:
 

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


 
Mais cela n'a pas l'air de fonctionner.
 
Pourrier vous me donner un coup de pousse SVP.

Reply

Marsh Posté le 06-11-2013 à 15:34:13   

Reply

Marsh Posté le 06-11-2013 à 20:26:39    

Quelle base de données ?
Il y a de grosses différences d'un SQL à l'autre.
S'il est question de Tablespace, alors c'est peut-être de l'Oracle.
 
Dans quel contexte s'exécute ce SQL ? Dans du PL/SQL, ou dans des requêtes simples ?
C'est plus facile dans du PL/SQL, car on peut avoir des variables pour stocker des résultats intermédiaires.
 
Ensuite, ce genre de filtre se fait habituellement dans un autre langage que SQL. Pourquoi se filtre ne se fait pas au moment du stockage des données, ou après la sélection d'une chaine de caractères ?
 
Pourquoi rechercher ces caractères interdits ?
Est-ce juste pour les remplacer, pour les supprimer ou pour les compter ?
 
Si c'est pour les remplacer, alors il y a la fonction TRANSLATE() qui fait ça très bien.
Si c'est pour les supprimer, alors on peut utiliser la fonction TRANSLATE() associée à la fonction TRIM()
Si c'est pour les compter, alors on peut utiliser la fonction TRANSLATE() associée à la fonction LENGTH()
On peut jouer aussi avec INSTR() et DECODE().
Ou si c'est dans du PL/SQL, on peut carrément faire une boucle sur chaque caractère pour voir s'il est interdit ou non. C'est le plus simple et il ne faut pas croire que ce serait plus long qu'une autre façon de faire qui serait plus condensée.
 
Voili. Bon courage.


Message édité par olivthill le 06-11-2013 à 20:27:07
Reply

Marsh Posté le 06-11-2013 à 22:51:37    

solk17 a écrit :

bonjour à tous,
 
Depuis peu j'essaye de créer un expression régulière en SQL mais je m'y prend assez mal et cela ne fonctionne pas.
 
J'aimerai rechercher sur une un champ de type varchar, toute les occurrences ayant ayant au moins un caractère interdit. Ici les caractère interdits sont les caractères différents de ceux autorisés:
 
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w",
"x","y","z"
,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"
,"0","1","2","3","4","5","6","7","8","9","/","-","?",":","("," )",".",
",","’","+"
 
J'ai bien essayé de faire cela avec INTERSECT, mais mon tablespace est trop petit pour pouvoir exécuter cette requête.
 
J'ai donc penser aux expressions régulière, mais je ne capte pas grand chose à cela. Pour avoir des caractère uniquement alphanumérique ainsi que des espace j'ai fait:
 

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


 
Mais cela n'a pas l'air de fonctionner.
 
Pourrier vous me donner un coup de pousse SVP.


 :hello: !
 
À mon avis, avec le SELECT que tu fais, c'est normal que tu n'obtiens pas ce que tu souhaites  [:cupra]  
En effet, tu écris :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '\W \S ');


ce qui se traduit par : nom_lib doit être composé  d'un caractère alphanumérique, suivi d'un espace suivi d'un espace ou tabulation, suivi d'un espace.
(soit dit en passant, je ne sais pas si les notations \W et \S existent en SQL :/)
 
Pour moi, il faudrait plutôt une expression du genre :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '^[[:alnum:] ]+$');


ce qui revient à retrouver tous les nom_lib comportant 1 ou plus des caractères compris dans les crochets, à savoir un caractère alphanumérique ou un espace.
Le ^ et le $ t'assurent que nom_lib ne comporte que les caractères souhaités.
 
Pour en revenir à ta question initiale, la regexp qui pourrait convenir est du genre :

Code :
  1. SELECT nom_lib FROM table WHERE regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


où on ne garde que les nom_lib comportant un caractère parmi ceux présents dans les crochets.
 
:jap:


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 07-11-2013 à 09:25:49    

Bonjour,
 
Cela à l'air de fonctionner pour trouver les caractères autorisés.
 
Pour répondre à olivthill oui il s'agit d'oracle.  
 
Je me suis peux être mal exprimé dans mon premier post. Mais je voudrai en réalité une requête qui recherche tous les nom_lib qui ont au moins un caractère différent de ceux que j'ai décrit dans le premier Post.
 
J'ai bien tester:
 

Code :
  1. SELECT nom_lib FROM table WHERE not regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


 
Mais sans succès visiblement.
 
Je croyais que le ^ excluait les caractères définis dans l’expression régulière, non?
 
 
Merci de votre aide et de vos réponses!  :love:  

Reply

Marsh Posté le 07-11-2013 à 10:32:07    

C'est bon j'ai trouver.
 
J'ai fais ceci.
 

Code :
  1. select nom_lib from table1 where nom_ID not in (SELECT nom_ID FROM table1 WHERE regexp_like (nom_lib, '^[-a-zA-Z0-9/?:().,’+ ]+$'));


 
il faut mettre le '-' en début de condition pour qu'il soit accepter.
 
Merci encore.

Reply

Marsh Posté le 07-11-2013 à 12:00:05    

solk17 a écrit :

Bonjour,
 
Cela à l'air de fonctionner pour trouver les caractères autorisés.
 
Pour répondre à olivthill oui il s'agit d'oracle.  
 
Je me suis peux être mal exprimé dans mon premier post. Mais je voudrai en réalité une requête qui recherche tous les nom_lib qui ont au moins un caractère différent de ceux que j'ai décrit dans le premier Post.
 
J'ai bien tester:
 

Code :
  1. SELECT nom_lib FROM table WHERE not regexp_like (nom_lib, '[a-zA-Z0-9/-?:().,’+]');


 
Mais sans succès visiblement.
 
Je croyais que le ^ excluait les caractères définis dans l’expression régulière, non?
 
 
Merci de votre aide et de vos réponses!  :love:  


 
C'est vrai que j'avais compris le contraire en fait  :whistle:  
 
Sinon, pour l'histoire du ^, tout dépend où il se trouve :

  • en début de pattern, cela signifie que c'est en début de ligne ;
  • dans une expression entre crochets, cela veut dire "un caractère qui n'est pas compris dans la liste entre crochets".


 [:cupra]


---------------
And in the end, the love you take is equal to the love you make
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed