将 CamelCase 转换为 underscore_case

Convert CamelCase to underscore_case

我正在尝试将列值从 CamelCase 转换为 underscore_case,这是我尝试过的:

SELECT regexp_replace(ColumnName, '([A-Z])', '_', 2) FROM Table;

但这将 return d_a_r_k_C_y_a_n 用于值 darkCyan

我该如何解决这个问题?

您可以使用

SELECT regexp_replace('AbcDef', '([A-Z])', '_', 2, 0, 'c') from dual

其中2表示第二个字符是搜索匹配的起点,0表示应该找到所有匹配,c指定区分大小写的搜索和替换.

查看online test,结果:

这个问题可能很棘手,甚至可能是一堆蠕虫,因为骆驼案例可能有一些难以处理的边缘案例。考虑以下驼峰式字符串,它的中间恰好有一个全大写的首字母缩写词:

myIBMComputerIsSlow

如果我们想把首字母缩略词IBM中的每个字母都当作一个单独的词来对待,那么@wiktor给出的答案就很好地解决了这个问题。然后我们将得到以下结果:

my_I_B_M_Computer_Is_Slow

另一方面,如果我们想要保留首字母缩略词,那么我们必须做更多的工作:

SELECT
    REGEXP_REPLACE(REGEXP_REPLACE ('myIBMComputerIsSlow', '([A-Z])([A-Z][a-z])',
                                   '_', 1, 0, 'c'),
                  '([a-z])([A-Z])', '_', 1, 0, 'c') AS output
FROM dual

这将输出以下内容:

my_IBM_Computer_Is_Slow

在这种情况下,我们可以在以下两种情况之一的情况下在字符串中插入下划线分隔符:

  • 小写字母后紧跟着一个大写字母
  • 大写字母后接大写字母,再接小写字母

请注意,第二种情况是我们如何检测首字母缩略词的结尾和新的驼峰式单词的开头。

如果您希望整个输出都是小写的(您的问题似乎暗示了这一点),那么您可以添加另一个步骤并使用 LOWER 函数。

Demo

楼主的sql:

SELECT regexp_replace(ColumnName, '([A-Z])', '_', 2) FROM Table;

在 Oracle 12c sql 中工作正常,即 'darkCyan' 变为 'dark_cyan'。