背景知识:
问题:
有兴趣知道我们是否有任何替代方法可以将正则表达式本身传递给oracle regexp_like()。
解释的示例场景:
Regexp - 在regexp_like()中使用的“STANDARD。* TIME”将匹配包含单词STANDARD和TIME的所有时区。假设我想从匹配的时区中排除“印度标准时间”,“大西洋标准时间”,“爱尔兰标准时间”
答案 0 :(得分:0)
我很想知道为什么使用' NOT'是不可能的。但是如果你正在寻找一个有趣的正则表达式解决方案,我不认为REGEXP_LIKE会起作用,因为Oracle风格不支持负面预测。但是,在框外思考一点,并且知道如果找不到模式,REGEX_REPLACE返回NULL,你可以做这样的事情(虽然只是因为你不能意味着你应该和我一起使用NOT而不是REGEXP_LIKE): / p>
SQL> with tbl(str) as (
select 'INDIAN STANDARD TIME' from dual union all
select 'ATLANTIC STANDARD TIME' from dual union all
select 'IRISH STANDARD TIME' from dual union all
select 'EASTERN STANDARD TIME' from dual union all
select 'PST STANDARD TIME' from dual union all
select 'CST STANDARD TIME' from dual
)
select str
from tbl
where str = regexp_replace(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME', 'DO NOT WANT THESE');
STR
----------------------
EASTERN STANDARD TIME
PST STANDARD TIME
CST STANDARD TIME
SQL>
所以这会替换你不想要的字符串,然后比较它们。由于未找到匹配,因此select不会返回它们。仍然没有那么干净:
select str
from tbl
where NOT regexp_like(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME');