验证Oracle REGEXP_SUBSTR中的子表达式

时间:2019-06-14 11:52:08

标签: regex oracle oracle12c regexp-substr

Oracle 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;

获取键101.4的值43

但是所需的键可以位于任意随机位置。有没有一种方法可以获取任何给定键的值?

1 个答案:

答案 0 :(得分:4)

您可以使用

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

请参见this regex demothis regex graph

enter image description here

说明

  • ^-字符串的开头
  • (:[^:]+:[^:]+)*?-出现零个或多个,但尽可能少的:和除:以外的1个以上字符的两次重复
  • :43:-冒号之间的键
  • ([^:]+)-第2组(结果)::以外的1个或更多字符