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语句,它接受一个字符串,并删除(理想地嵌套)括号和括号内的所有文本?请注意,可能有多组括号(不一定是嵌套的),所以我需要它来删除每个括号。
答案 0 :(得分:3)
您可以使用
select regexp_replace('This is a (bad) sample, (my) friend','\([^()]*\)', '') from dual
JavaScript正则表达式文字中使用的正则表达式分隔符不应该是Oracle正则表达式模式(基于POSIX)的一部分。
如果您还希望删除单词之前的可选空格,请在该模式之前添加\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 demo和regex demo。
<强>详情
\s*
- 0+ whitespaces \(
- (
[^()]*
- 除(
和)
(\([^()]*\)[^()]*)*
- 0+序列
\([^()]*\)
- (
,除了(
和)
以及)
[^()]*
- 除(
和)
\)
- )
。