如何使用regexp在Oracle中使用匹配的字符串拆分字符串?

时间:2013-10-18 18:24:59

标签: sql regex oracle

目前我已经这样了,但它正在返回null

select  regexp_substr(  'abcx1bcdx2mno',  '[^x[[:digit:]]]+', 1,1 ) from dual;
select  regexp_substr(  'abcx1bcdx2mno',  '[^x[[:digit:]]]+', 1,1 ) from dual;

我希望这样,第一个查询返回abc,第二个返回bcd

1 个答案:

答案 0 :(得分:1)

不幸的是我们不能否定一组字符(搜索字符串)。作为一种解决方法,我们可以用一个字符替换我们的搜索字符串,例如空格,然后否定那一个字符:

这是一个简单的例子:

with t1(col) aS(
  select 'abcx1bcdx2mno' from dual
)
select regexp_substr( regexp_replace(col, 'x[[:digit:]]', ' '), '[^ ]+'
                     , 1, level) as res
  from t1
connect by level <= regexp_count( regexp_replace(col, 'x[[:digit:]]', ' ')
                                 , '[^ ]+')

注意:oracle 11g版本中引入了regexp_count()正则表达式函数。

结果:

RES         
-------------
abc           
bcd           
mno