Oracle使用REGEXP_SUBSTR返回括号内的值

问题描述 投票:0回答:3

我们在数据库中存储了一些应用程序参数,我正在寻找一种通过SQL提取/解析参数的方法。这些数据的一个例子如下:

PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]

因此,例如,投影的值将是“横向”,引号将是其中的一部分。我认为最简单的方法是使用REGEXP_SUBSTR函数。这是我目前的尝试:

SELECT REGEXP_SUBSTR('PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]', 'PROJECTION\[[^][]*\]') FROM dual;

虽然返回:

PROJECTION["Transverse"]

我意识到我可以删除不需要的字符,但我很好奇是否有人可以推荐任何REGEX调整,以便SELECT查询返回简单的“横向”这个例子。投影并不总是我想要拉出来的,例如,如果我想要Unit那么我需要返回:“Two”,2

这是使用Oracle数据库10g企业版10.2.0.5.0 - 64bi

regex oracle
3个回答
1
投票
SELECT REGEXP_REPLACE(
   'PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]',
   '^.*PROJECTION\[(.+?)\].*$', '\1'
) FROM dual

0
投票

你可以使用反向引用(\1\2等)。基本上你想匹配字符串的三个部分:

  1. PROJECTION参数值之前的所有内容。
  2. PROJECTION参数值。
  3. PROJECTION参数值之后的所有内容。

这三个匹配的正则表达式必须在括号内,以便反向引用。我想出的正则表达式是这样的:

(.*PROJECTION\[")(.+)("].*)
                     ^^^^^^ Backref 3: everything after the PROJECTION parameter value
                 ^^^^ Backref 2: the PROJECTION parameter value
^^^^^^^^^^^^^^^^^ Backref 1: everything before the PROJECTION parameter value

然后只需用backref 2替换,忽略1和3:

REGEXP_REPLACE(expr, '(.*PROJECTION\[")(.+)("].*)', '\2')

0
投票
SELECT REGEXP_SUBSTR('PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]', 'PROJECTION\[([^][]*)\]', 1, 1, null, 1) FROM dual;
© www.soinside.com 2019 - 2024. All rights reserved.