Vous n'êtes pas identifié(e).
Pages : 1
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
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
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
Pages : 1