将 CamelCase 转换为 underscore_case

Ich*_*aki 0 regex oracle camelcasing uppercase

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

SELECT regexp_replace(ColumnName, '([A-Z])', '_\1', 2) FROM Table;
Run Code Online (Sandbox Code Playgroud)

但这将返回d_a_r_k_C_y_a_nvalue darkCyan

我该如何解决这个问题?

Tim*_*sen 7

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

myIBMComputerIsSlow
Run Code Online (Sandbox Code Playgroud)

如果我们想将首字母缩略词IBM中的每个字母视为一个单独的单词,那么@wiktor 给出的答案就很好地涵盖了这个问题。然后我们会得到以下结果:

my_I_B_M_Computer_Is_Slow
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容:

my_IBM_Computer_Is_Slow
Run Code Online (Sandbox Code Playgroud)

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

  • 小写字母后紧跟大写字母
  • 大写字母后跟大写,然后是小写

请注意,第二种情况是我们如何检测首字母缩略词正在结束并且一个新的驼峰式单词正在开始。

如果您想要小写的整个输出,这就是您的问题所暗示的,那么您可以添加另一个步骤并使用该LOWER函数。

演示