如何从oracle中的字符串中仅删除左括号和右括号?

时间:2020-03-06 05:40:09

标签: oracle

我有一个像这样的字符串:

(1/8英寸TBE ASME B1.20.1(NPT)外螺纹x Fem CL400 CU合金B152 Gr C10400水泥衬里)

我需要这样的输出:

1/8英寸TBE ASME B1.20.1(NPT)外螺纹x Fem CL400 CU合金B152 Gr C10400水泥衬里

即只能在开头和结尾处除去括号,而不是在中间。

也 如果字符串是这样的,要么有起始括号,要么有结束括号

(1/8英寸TBE ASME B1.20.1(NPT)外螺纹x Fem CL400 CU合金B152 Gr C10400水泥衬里

1/8英寸TBE ASME B1.20.1(NPT)外螺纹x Fem CL400 CU合金B152 Gr C10400水泥衬里)

然后不要卸下括号。

我尝试使用regexp_replace,但找不到解决方案。 任何帮助都是可观的

1 个答案:

答案 0 :(得分:3)

简单的CASE足以删除前导结尾括号

with txt as (
select '(xxxx)' txt from dual union all
select '(x(x)xx)' txt from dual union all
select '(xxxx' txt from dual union all
select 'xxxx)' txt from dual union all
select 'xxxx' txt from dual)
select txt,
case when txt like '(%)' then 
    substr(txt,2,length(txt)-2)
else
   txt
end as new_txt
from txt

给予

TXT      NEW_TXT
-------- --------
(xxxx)   xxxx     
(x(x)xx) x(x)xx   
(xxxx    (xxxx    
xxxx)    xxxx)    
xxxx     xxxx  

或者,您可以按以下方式使用REGEXP

select 
  txt,
  nvl(
     REGEXP_SUBSTR(txt, '^\((.*)\)$', 1, 1, null, 1),
     txt)
  as txt_new
from txt

正则表达式'^\((.*)\)$'强制使用了前括号和后括号,并返回-第一组(REGEXP_SUBSTR的第五个参数)之间的部分。

如果REGEXP_SUBSTR返回注释,即表达式不包含在括号中 ,则NVL返回原始值。