Regex_replace在Oracle SQL中无法正确替换

时间:2016-07-19 11:54:16

标签: sql regex oracle

我试图让以下Regex表达式与Oracle SQL一起使用:

select regexp_replace('    "abc_78": 123, ', '.*?abc.*?: (.*?),.*', '\1') from dual;
select regexp_replace('    "abc_78": 123, "def_79": [', '.*?abc.*?: (.*?),', '\1') from dual;

第一个返回"123"(我认为是正确的),而第二个返回"123 "def_79": ["

这里涉及的问题是什么?一个糟糕的正则表达式或Oracle的一些奇怪的功能?在针对Sublime Text进行尝试时,正则表达式似乎运行良好。我直接在Oracle SQL Developer上运行此查询。

由于

1 个答案:

答案 0 :(得分:1)

正在正确替换。

select regexp_replace('    "abc_78": 123, "def_79": [', '.*?abc.*?: (.*?),', '\1') from dual;

首先:它(正则表达式引擎)找到'“abc_78”:123'其中123是组$ 1。 然后用组1替换'abc_78:123',即123。

你在那些正则表达式模式中几乎没有差异,如:

'.*?abc.*?: (.*?),.*', '\1') from dual;
'.*?abc.*?: (.*?),', '\1') from dual;

缺少。*第二种模式。

如果您想从此字符串中检索123,最好使用regex_substr

select regexp_substr('    "abc_78": 123, ','\d+',1,2) from dual;