J'essaie de convertir la valeur de la colonne de CamelCase en underscore_case, voici ce que j'ai essayé:
SELECT regexp_replace(ColumnName, '([A-Z])', '_\1', 2) FROM Table;
Mais cela renverra d_a_r_k_C_y_a_n
pour la valeur darkCyan
.
Comment puis-je résoudre ça ?
3 réponses
Cette question peut être délicate, peut-être même une boîte de vers, car le cas de chameau peut avoir des cas extrêmes qui sont difficiles à gérer. Considérez la chaîne de casse camel suivante, qui se trouve avoir un acronyme entièrement en majuscules au milieu:
myIBMComputerIsSlow
Si nous voulons traiter chaque lettre de l'acronyme IBM
comme un mot séparé, alors la réponse donnée par @wiktor couvre bien ce problème. On aboutirait alors à ce qui suit:
my_I_B_M_Computer_Is_Slow
Si, par contre, nous voulons conserver l'acronyme, nous devons faire plus de travail:
SELECT
REGEXP_REPLACE(REGEXP_REPLACE ('myIBMComputerIsSlow', '([A-Z])([A-Z][a-z])',
'\1_\2', 1, 0, 'c'),
'([a-z])([A-Z])', '\1_\2', 1, 0, 'c') AS output
FROM dual
Cela produirait les éléments suivants:
my_IBM_Computer_Is_Slow
Dans ce cas, nous pouvons insérer un trait de soulignement dans la chaîne sous l'une des deux conditions suivantes:
- une lettre minuscule est immédiatement suivie d'une lettre majuscule
- une lettre majuscule est suivie de majuscule, suivie de minuscule
Notez que le deuxième cas est la façon dont nous détectons qu'un acronyme se termine et qu'un nouveau mot casse chameau commence.
Si vous voulez que la sortie entière soit en minuscules, ce que semble impliquer votre question, vous pouvez alors ajouter une autre étape et utiliser la fonction LOWER
.
Le sql de l'affiche originale:
SELECT regexp_replace(ColumnName, '([A-Z])', '_\1', 2) FROM Table;
Fonctionne bien dans Oracle 12c sql, c'est-à-dire que «darkCyan» devient «dark_cyan».
Vous pouvez utiliser
SELECT regexp_replace('AbcDef', '([A-Z])', '_\1', 2, 0, 'c') from dual
Où 2
indique que le deuxième caractère est le point de départ pour rechercher une correspondance, 0
signifie que toutes les correspondances doivent être trouvées et c
spécifie une recherche et un remplacement sensibles à la casse.
Consultez le test en ligne, résultat:
De nouvelles questions
regex
Les expressions régulières fournissent un langage déclaratif pour faire correspondre les modèles dans les chaînes. Ils sont couramment utilisés pour la validation, l'analyse et la transformation de chaînes. Étant donné que les expressions régulières ne sont pas entièrement standardisées, toutes les questions avec cette balise doivent également inclure une balise spécifiant le langage de programmation ou l'outil applicable.