【问题标题】:Can we exclude match with few strings in oracle regexp_like()?我们可以在 oracle regexp_like() 中排除少数字符串的匹配吗?
【发布时间】:2017-12-04 10:34:43
【问题描述】:

背景知识:

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

问题:

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

示例场景说明:

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

【问题讨论】:

  • 为什么不用“NOT”?

标签: regexp-like


【解决方案1】:

我很想知道为什么使用“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');

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多