【问题标题】:Fetching value from Pipe-delimited String using Regex (Oracle)使用正则表达式(Oracle)从管道分隔的字符串中获取值
【发布时间】:2016-02-20 13:28:45
【问题描述】:

我有一个如下所示的示例源字符串,它采用管道分隔格式,因为值 obr 可以位于任何位置。我需要从 obr 的第一次出现中获取管道的第二个值。因此,对于以下源字符串,预期将是,

源字符串:

select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual

预期输出:

value1
value2
value3

我已经在 oracle sql 中尝试了以下正则表达式,但它不能正常工作。

with t as (
            select 'asd|dfg|obr|1|value1|end' text from dual
            union all
            select 'a|brx|123|obr|2|value2|end' from dual
            union all
            select 'hfv|obr|3|value3|345|pre|end' from dual
            )
            select text,to_char(regexp_replace(text,'*obr\|([^|]*\|)([^|]*).*$', '\2')) output from t;

当字符串以 OBR 开头时它工作正常,但是当 OBR 像上面的示例一样位于中间时它不能正常工作。

任何帮助将不胜感激。

【问题讨论】:

  • 您说 'obr' 可以在列表中的任何位置。如果 'obr' 是列表中倒数第二个或倒数第二个怎么办?

标签: sql regex oracle regexp-replace regexp-substr


【解决方案1】:

不确定 Oracle 如何处理正则表达式,但以星号开头通常意味着您要查找零个或多个空字符。

你试过'^.*obr\|([^|]*\|)([^|]*).*$'吗?

【讨论】:

  • 它运作良好。但它也匹配这种字符串,但从技术上讲它不应该发生。 'a|brx|123|obriem|2|value2|end'
  • 然后将其添加到您的测试数据中
  • 考虑大型机或 unix 编辑器(例如 sed),您是否可能使用覆盖而不是插入,从而删除了“\|”搜索“obr”?您的字符串是否仍然包含 "...obr\|..." 还是现在是 "...obr([..."?
【解决方案2】:

这处理空元素并被包装在 NVL() 调用中,如果未找到 'obr' 或出现在记录末尾太远,则提供一个值,因此不可能有 2 个值:

SQL> with t(id, text) as (
     select 1, 'asd|dfg|obr|1|value1|end'      from dual
     union
     select 2, 'a|brx|123|obr|2|value2|end'    from dual
     union
     select 3, 'hfv|obr|3|value3|345|pre|end'  from dual
     union
     select 4, 'hfv|obr||value4|345|pre|end'   from dual
     union
     select 5, 'a|brx|123|obriem|2|value5|end' from dual
     union
     select 6, 'a|brx|123|obriem|2|value6|obr' from dual
   )
   select
     id,
     nvl(regexp_substr(text, '\|obr\|[^|]*\|([^|]*)(\||$)', 1, 1, null, 1), 'value not found') value
   from t;

        ID VALUE
---------- -----------------------------
         1 value1
         2 value2
         3 value3
         4 value4
         5 value not found
         6 value not found

6 rows selected.

SQL>

正则表达式基本上可以读作“查找管道的模式,然后是'obr',然后是管道,然后是零个或多个不是管道的字符,然后是管道,然后是零或多个不是管道的字符(在捕获的组中记住),后跟管道或行尾”。 regexp_substr() 调用然后返回第一个捕获的组,它是来自 'obr' 的管道 2 个字段之间的字符集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多