【问题标题】:Convert CamelCase to underscore_case将 CamelCase 转换为 underscore_case
【发布时间】:2017-11-24 14:10:14
【问题描述】:

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

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

但这将返回 d_a_r_k_C_y_a_n 的值 darkCyan

我该如何解决这个问题?

【问题讨论】:

    标签: regex oracle uppercase camelcasing


    【解决方案1】:

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

    myIBMComputerIsSlow
    

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

    my_I_B_M_Computer_Is_Slow
    

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

    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
    

    这将输出以下内容:

    my_IBM_Computer_Is_Slow
    

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

    • 小写字母后紧跟大写字母
    • 大写字母后跟大写,再跟小写

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

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

    Demo

    【讨论】:

    • 这里不考虑两个大写字母相邻的情况。 ABCD 将保持不变,而不是变为 A_B_C_D
    • @MT0 相反,我是故意这样做的。我假设像ComputerIBM 这样的骆驼案例名称应该呈现为Computer_IBMnot 呈现为Computer_I_B_M。如果您可以提供有关骆驼案例约定的参考,请提供。否则,请不要误称他人。
    • 如果您对问题做出假设,那么将这些假设包含在您的答案中很有用,这样每个人都知道会发生什么。我没有说答案是错误的(同样我没有说它是正确的)——我只是说它没有考虑一个案例。如果您已经考虑并忽略了它,那么答案中没有说明,未来可能访问此问题的读者可能不会意识到这两种解决方案之间的细微差别(您不会在连续的大写字母之间添加下划线,但 Wiktor Stribiżew 的答案会)。
    【解决方案2】:

    你可以使用

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

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

    查看online test,结果:

    【讨论】:

      【解决方案3】:

      原发帖者的sql:

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

      在 Oracle 12c sql 中运行良好,即“darkCyan”变为“dark_cyan”。

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 2019-01-01
        • 1970-01-01
        • 2011-05-08
        • 2016-05-16
        • 2013-10-03
        • 1970-01-01
        • 2022-07-08
        • 2019-12-24
        相关资源
        最近更新 更多