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