2

背景知识:

  1. 我们不能使用 (?!) 来排除,因为 regexp_like() 不支持负前瞻。
  2. 我不想使用 'NOT REGEXP_LIKE()' 来排除
  3. [^] 只能否定单个字符,但不能否定字符串

问题:

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

示例场景来解释:

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

4

1 回答 1

0

我很想知道为什么使用“NOT”是不可能的。但是,如果您正在寻找一个有趣的正则表达式解决方案,我认为 REGEXP_LIKE 不会起作用,因为 Oracle 风格不支持负前瞻。但是,跳出框框思考一下,如果找不到模式,则知道 REGEX_REPLACE 返回 NULL,您可以执行以下操作(尽管您可以这样做并不意味着您应该,我会使用 NOT 与 REGEXP_LIKE):

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 str
from tbl
where NOT regexp_like(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME');
于 2017-12-05T17:06:49.240 回答