Oracle - 删除括号中的子括号

时间:2017-11-02 11:24:32

标签: regex oracle

Oracle 12cR1 - 我正在编写一个基于Web的应用程序。我需要处理一个字符串并删除打开/关闭括号和其中的所有文本。例如,如果我的输入是

This is a (bad) sample, (my) friend

输出应为

This is a sample, friend

我在Javascript中使用它。我需要它在BOTH javascript和Oracle SQL中工作。 Javascript中的代码是

var s2 = s1.replace(/\([^()]*\)/g, '');

当我尝试将其转换为Oracle SQL时,没有任何反应,也就是说我的输出与我的输入完全相同...

select regexp_replace('This is a (bad) sample','/\([^()]*\)/g', '') from dual;

在搜索中,有人发布了一个不同的正则表达式,我试过了。同样,输出没有变化。

select regexp_replace('This is a (bad) sample','(?<=\()[\d.]+(?=\))', '') from dual;

理想,我想要的是一个正则表达式,它也处理嵌套的括号,删除整个短语。

This is a ((really) bad) example

应该返回

This is a example

对于嵌套括号,JavaScript表达式匹配最内部的括号,所以我只需要运行两次代码,这是有效的。

总而言之,什么是Oracle SQL语句,它接受一个字符串,并删除(理想地嵌套)括号和括号内的所有文本?请注意,可能有多组括号(不一定是嵌套的),所以我需要它来删除每个括号。

1 个答案:

答案 0 :(得分:3)

您可以使用

select regexp_replace('This is a (bad) sample, (my) friend','\([^()]*\)', '') from dual

请参阅online Oracle demo

JavaScript正则表达式文字中使用的正则表达式分隔符不应该是Oracle正则表达式模式(基于POSIX)的一部分。

enter image description here

如果您还希望删除单词之前的可选空格,请在该模式之前添加\s*

regexp_replace('This is a (bad) sample, (my) friend','\s*\([^()]*\)', '')
                                                      ^^^

\s*匹配0 +空白字符。

请注意,您无法使用Oracle正则表达式处理嵌套括号,因为它不支持递归/平衡构造。

但是,您可以使用

处理2个深度级别
select regexp_replace(
  'This is a (bad) sample, (my) friend and this is a ((really) bad (and more bad)) example',
  '\s*\([^()]*(\([^()]*\)[^()]*)*\)',
   '') as Result from dual

请参阅another Oracle demoregex demo

<强>详情

  • \s* - 0+ whitespaces
  • \( - (
  • [^()]* - 除()
  • 以外的0个字符
  • (\([^()]*\)[^()]*)* - 0+序列
    • \([^()]*\) - (,除了()以及)
    • 以外的0个字符
    • [^()]* - 除()
    • 以外的0个字符
  • \) - )

enter image description here