从双中选择regexp_replace('aaa_bbb','(_。)',upper('\ 1'))

时间:2019-10-07 10:13:07

标签: sql oracle regexp-replace

使用Oracle 11g

select regexp_replace('aaa_bbb', '(_.)', upper('\1')) from dual;

我想要'aaa_Bbb'

但是,它返回'aaa_bbb'

为什么不能替换?

4 个答案:

答案 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;

upperregexp_replace之前执行,从而有效地做到了:

select regexp_replace('aaa_bbb', '(_.)', '\1') from dual;

所以您需要一种不同的方法。

查看对oracle regexp replace uppercase replacement string的答案

答案 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

Demo