在 Oracle REGEXP_SUBSTR 中验证子表达式

Validating subexpression in Oracle REGEXP_SUBSTR

甲骨文 12cR1

我有一列包含如下所示的冗长字符串

:Key1:Value1:Key2:Value2:Key3:Value3:Key4...…..

密钥是唯一的数字。这些值是任何字符串值,甚至可以是与任何其他键相同的数字。如果我给一个键,我必须得到它对应的值。例如,

lengthy_str_col := ':101:abc:12:43:43:101.4:4:bus'

为了获取键值 43,我尝试了以下操作。

SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)') FROM DUAL;

这给了我第一个键值对 ':1:abc'。现在我知道 43 是第三个键,我使用

SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)', 1, 3, 'i', 4) FROM DUAL;

获取键 43 的值 101.4

但所需的密钥可以在任何随机位置。有没有办法获取任何给定键的值?

您可以使用

select REGEXP_SUBSTR(':101:abc:12:43:43:101.4:4:bus', '^(:[^:]+:[^:]+)*?:43:([^:]+)', 1, 1, NULL, 2) as Result from dual

this regex demo and this regex graph:

说明

  • ^ - 字符串的开头
  • (:[^:]+:[^:]+)*? - 零次或多次重复 : 和除 :
  • 以外的 1+ 个字符
  • :43: - 冒号之间的键
  • ([^:]+) - 第 2 组(结果):除 :
  • 以外的 1 个或多个字符