如何从oracle中的正则表达式中排除特定的字符串/模式?

时间:2013-08-14 07:56:43

标签: regex string oracle

我需要一个关于正则表达式(oracle)中的排除案例的紧急帮助。

主要的正则表达方式是:

1([^4][:;]|[0-9][^:;].*)

我需要修改或增强此正则表达式,以便排除特定字符串“1013;”但无法实现。我一直在寻找解决方案两天,但找不到任何在甲骨文中有效的方法。

最流行的解决方案替代方法(?!stringToExclude)Regexp在oracle中不起作用。 (我的版本:Oracle Database 11g企业版版本11.2.0.2.0 - 64位生产)

你对这个问题有什么看法吗?我怎样才能克服这个问题?

我的测试sql语句检查新regexp的验证是:

select regexp_substr('1013;', '1([^34][:;]|[0-9][^:;].*)') from dual --> returns 1013;
select regexp_substr('10133;', '1([^34][:;]|[0-9][^:;].*)') from dual --> returns 10133;

select regexp_substr('1013;', 'to be regexp') from dual --> should return nothing
select regexp_substr('1013', 'to be regexp') from dual --> should return nothing
select regexp_substr('1013:', 'to be regexp') from dual --> should return nothing
select regexp_substr('10133;', 'to be regexp') from dual --> should return 10133;

1 个答案:

答案 0 :(得分:1)

尝试使用regexp无法找到的字符串替换要排除的字符串。 e.g

with str as 
(
select '1013;' as s from dual
union 
select '1013' from dual 
union 
select '1013:' from dual 
union 
select '10133;' from dual 
)
select 
  s
, regexp_substr(s, '1([^34][:;]|[0-9][^:;].*)')       --> regexp
, regexp_replace(s,'^1013($|:|;)','x')                --> replaced string
, regexp_substr(regexp_replace(s,'^1013($|:|;)','x')
                , '1([^34][:;]|[0-9][^:;].*)')        --> regexp with replaced string
from 
str
;