PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 25/12/2018 21:56:41

recherche de motif

Salut et bonne fête de noël à tous les frères et sœurs chrétiens.
Je cherche à isoler des parties d'un texte correspondant à une formule de calcul.
L'expression est du genre P!XXX+R!YYY*1.5-G!ZZZ{III}...
L'objectif est de capturer les termes P!XXX, R!YYY, G!ZZZ{III}.
J'ai tenter avec les expression régulière. Le code suivant me déroute.

select substring('P!AB+G!AD(15)+P!AN', 'P\![A-Z]+')
,'G!AD(15)' similar to 'G\![A-Z]+\(%\)',
substring('P!AB+G!AD(15)+P!AN','G\![A-Z]+\(%\)')

Pourquoi

substring('P!AB+G!AD(15)+P!AN','G\![A-Z]+\(%\)')

renvoie NULL alors que

'G!AD(15)' similar to 'G\![A-Z]+\(%\)'

donne TRUE?
Merci d'avance.

Hors ligne

#2 26/12/2018 16:55:11

dverite
Membre

Re : recherche de motif

La forme à 2 arguments: substring(text,text) utilise des expressions régulières du standard POSIX alors que SIMILAR TO utilise la syntaxe du standard SQL. Ces deux syntaxes sont différentes et incompatibles.


En revanche cette forme là:  substring(string FROM pattern FOR escape) ou a 3 arguments utilise la syntaxe du standard SQL.


Comme vous voulez extraire plusieurs termes d'une seule chaîne, je pense que  regexp_match et les expressions POSIX seraient le meilleur choix.

Hors ligne

#3 26/12/2018 23:34:10

Re : recherche de motif

Salut et merci
J'apprends que les regex avec les sgbd s'utilisent avec POSIX ou SQL. Merci.
Après plusieurs bidouilles, je suis arrivé à ça...

select c from (select unnest(regexp_matches('P!AB+G!AD{15}+3*P!AN/R!CD', '(R\![A-Z]+)|(P\![A-Z]+)|(G\![A-Z]+\{[0-9,A-Z]+\})','g')) as c) as r where c is not null

@+

Hors ligne

Pied de page des forums