Comment extraire un groupe d’une expression régulière dans Oracle?

J’ai eu cette requête et je veux extraire la valeur entre les crochets.

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1) from DATABASE where col_name like '[%]'; 

Il me donne cependant la valeur avec les parenthèses telles que “[TEST]”. Je veux juste “TEST”. Comment modifier la requête pour l’obtenir?

Le troisième paramètre de la fonction REGEXP_SUBSTR indique la position dans la chaîne cible ( de_desc dans votre exemple) où vous souhaitez commencer la recherche. En supposant qu’une correspondance est trouvée dans la partie donnée de la chaîne, cela n’affecte pas ce qui est renvoyé.

Dans Oracle 11g, il existe un sixième paramètre pour la fonction, que je pense être ce que vous essayez d’utiliser, qui indique le groupe de capture que vous souhaitez renvoyer. Un exemple d’utilisation appropriée serait:

 SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual; 

Où le dernier paramètre 1 indique le numéro du groupe de capture à renvoyer.

10g ne semble pas avoir cette option, mais dans votre cas, vous pouvez obtenir le même résultat avec:

 select substr( match, 2, length(match)-2 ) from ( SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual ); 

puisque vous savez qu’un match aura exactement un caractère excédentaire au début et à la fin. (Vous pouvez également utiliser RTRIM et LTRIM pour supprimer les crochets des deux extrémités du résultat.)

Vous devez faire un remplacement et utiliser un modèle d’expression régulière qui correspond à la chaîne entière.

 select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;