Expression régulière REGEXP_REPLACE
Bonjour à tous,
J'ai un besoin très simple mais pas si évident à mettre en pratique car je ne maîtrise pas le sujet...
Je pars d'une chaine de caractères représentant une projection de SELECT :
Forme -> 'expression_1 AS nom_champ_1, expression_2 AS nom_champ_2, ..., expression_N AS nom_champ_N'
Exemple -> 'qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata'
Et je souhaite en extraire le nom des colonnes uniquement :
Forme -> 'nom_champ_1, nom_champ_2, ..., nom_champ_N'
Exemple -> 'toto, titi, tata'
J'ai trouvé quelques solutions :
1 - Avec une requête hiérarchique -> pas retenue car trop couteux
Code:
1 2 3 4 5 6 7
|
SELECT REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) AS substr
FROM (
SELECT 'qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,' AS str FROM DUAL
)
WHERE REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) IS NOT NULL
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^( AS )]+,')) + 1; |
2 - En combinant plusieurs REGEXP_REPLACE -> déjà mieux mais je suis sûr qu'on peut simplifier en une seule expression...
Code:
1 2 3 4 5 6 7 8 9 10
|
SELECT
REGEXP_REPLACE('qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,'
, '(' || REGEXP_REPLACE(REGEXP_REPLACE('qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,'
, '([^( AS )]+,)'
, '|')
, '([()$])'
, '\\\1') || ')'
, '')
FROM dual |
Avec-vous une idée pour réaliser cela en une seule passe de REGEXP_REPLACE ?
J'ai passé des heures de lecture de doc, tests, recherches sur le net... Mais je n'y arrive pas... Les groupes de capture ne me sortent que la dernière occurrence du pattern à extraire...
Merci d'avance :)