使用Oracle 11g
select regexp_replace('aaa_bbb', '(_.)', upper('\1')) from dual;
我想要'aaa_Bbb'
。
但是,它返回'aaa_bbb'
。
为什么不能替换?
答案 0 :(得分:2)
上部执行较早的Regexp
select regexp_replace('aaa_bbb', '(_.)', upper(regexp_substr('aaa_bbb', '(_.)'))) from dual
答案 1 :(得分:1)
问题
select regexp_replace('aaa_bbb', '(_.)', upper('\1')) from dual;
upper
在regexp_replace
之前执行,从而有效地做到了:
select regexp_replace('aaa_bbb', '(_.)', '\1') from dual;
所以您需要一种不同的方法。
答案 2 :(得分:0)
如果不是必须使用正则表达式方法,那么substr + instr + initcap
可能会有所帮助。
SQL> with test (col) as
2 (select 'aaa_bbb' from dual)
3 select substr(col, 1, instr(col, '_')) || initcap(substr(col, instr(col, '_') + 1)) result
4 from test;
RESULT
-------
aaa_Bbb
SQL>
答案 3 :(得分:0)
我认为没有直接的方法可以使用regexp_replace
进行转换,但是regexp_substr
可以通过以下方式实现:
with t(str) as
(
select 'aaa_bbb' from dual
)
select concat( regexp_substr(str, '.*[_^]'), initcap( regexp_substr(str, '[^_]+$') ) )
as "Formatted String"
from t;
Formatted String
----------------
aaa_Bbb