Oracle使用REGEXP_SUBSTR返回括号内的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle使用REGEXP_SUBSTR返回括号内的值相关的知识,希望对你有一定的参考价值。

我们在数据库中存储了一些应用程序参数,我正在寻找一种通过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

答案
SELECT REGEXP_REPLACE(
   'PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]',
   '^.*PROJECTION[(.+?)].*$', '1'
) FROM dual
另一答案

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

  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')
另一答案
SELECT REGEXP_SUBSTR('PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]', 'PROJECTION[([^][]*)]', 1, 1, null, 1) FROM dual;

以上是关于Oracle使用REGEXP_SUBSTR返回括号内的值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null

ORACLE:SQL REGEXP_SUBSTR 返回第一个分号和第二个分号之间的列值。在最后半个 clumn 之后还有其他值

Oracle正则表达式之 Regexp_substr,Regexp_instr,Regexp_replace,Regexp_like

Oracle中REGEXP_SUBSTR函数

在 Oracle 中使用 regexp_substr 按顺序拆分字符串

SQL REGEXP_SUBSTR 拆分时返回空字符串