1

目前我有这个,但它正在返回null

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

我想要这样,第一个查询返回abc,第二个返回bcd

4

1 回答 1

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:]]', ' ')
                                 , '[^ ]+')

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

结果:

RES         
-------------
abc           
bcd           
mno    
于 2013-10-18T18:32:40.673 回答