将CamelCase转换为snake_case

时间:2016-09-26 06:27:02

标签: sql postgresql

需要以下查询的结果

select regexp_replace('StackOverflow', 'something', 'something')

作为

stack_overflow

2 个答案:

答案 0 :(得分:6)

以下正则表达式在每个大写字母前面添加一个下划线:

regexp_replace(name, '([A-Z])','_\1', 'g'))

由于这会在开头产生下划线,因此需要使用trim()

删除
trim(both '_' from lower(regexp_replace(name, '([A-Z])','_\1', 'g')))

以下查询:

with names (name) as (
  values ('StackOverflow'), 
         ('Foo'), 
         ('FooBar'), 
         ('foobar'), 
         ('StackOverflowCom')
)
select name, trim(both '_' from lower(regexp_replace(name, '([A-Z])','_\1', 'g'))) as new_name
from names;

返回:

name             | new_name          
-----------------+-------------------
StackOverflow    | stack_overflow    
Foo              | foo               
FooBar           | foo_bar           
foobar           | foobar            
StackOverflowCom | stack_overflow_com

答案 1 :(得分:0)

我想你想要的是什么

<span title="This is good if you travel alone">
    <img src="images/weekend.png" class="pic-width border-radius" />
</span>

我们在这里测试一下,

lower(
  regexp_replace(
    replace(column_name, ' ', '_'),
    '([[:lower:]])([[:upper:]])',
    '\1_\2',
    'g'
  )
)

这比@a_horse_with_no_name更有优势,它可以使用连续的大写字母,也可以解决空格。

另见,