我们可以在oracle regexp_like()中用少量字符串排除匹配吗?

时间:2017-12-04 10:34:44

标签: regexp-like

背景知识:

  1. 我们不能使用(?!)排除,因为regexp_like()不支持负向前瞻。
  2. 我不想排除使用'NOT REGEXP_LIKE()'
  3. [^]可以仅取消单个字符,但不能取消字符串
  4. 问题:

    有兴趣知道我们是否有任何替代方法可以将正则表达式本身传递给oracle regexp_like()。

    解释的示例场景:

    Regexp - 在regexp_like()中使用的“STANDARD。* TIME”将匹配包含单词STANDARD和TIME的所有时区。假设我想从匹配的时区中排除“印度标准时间”,“大西洋标准时间”,“爱尔兰标准时间”

1 个答案:

答案 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');