来自Oracle的REGEXP_SUBSTR

时间:2018-02-07 14:31:01

标签: regex oracle

给定一串键值对:/* USER='Administrator'; UNV='Universe'; DOC='WebIntellignceReport'; */

我的目标是提取与USERUNVDOC键相关联的值。

使用(?<=UNV=')(.*?)(?=')的模式,我得到与Universe密钥(Fiddle)关联的UNV的预期值。

但是,当我使用REGEXP_SUBSTR模式时,我得到NULL

SELECT  text
        ,REGEXP_SUBSTR(text,'(?<=UNV='')(.*?)(?='')') UNV
FROM (
  SELECT  '/* USER=''Administrator''; UNV=''Universe''; DOC=''WebIntellignceReport''; */' as text 
  FROM    dual
) v  

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以提取第1组的内容:

SELECT  text, REGEXP_SUBSTR(text,'UNV=''(.*?)''', 1, 1 ,NULL, 1) UNV
FROM (
  SELECT  '/* USER=''Administrator''; UNV=''Universe''; DOC=''WebIntellignceReport''; */' as text 
  FROM    dual
) v

请参阅online demo

enter image description here

使用UNV='(.*?)',您可以在UNV=之后提取最接近的单个quuotes之间的内容。

答案 1 :(得分:0)

我认为最简单的事情就是使用REGEXP_SUBSTR抓取整个键值对,然后再做另一个substr来取出你想要的值。

with v as (select '/* USER=''Administrator''; UNV=''Universe''; DOC=''WebIntellignceReport''; */' as text from dual)
select text, key_val, substr(key_val, instr(key_val, '''')+1, length(key_val)-instr(key_val, '''')-2)
from (
    select text, 
    regexp_substr(text, ' UNV=''[^'']*'';') key_val 
    from v);

输出:

TEXT                                                                    KEY_VAL                                                                 VAL                                                                    
----------------------------------------------------------------------- ----------------------------------------------------------------------- -----------------------------------------------------------------------
/* USER='Administrator'; UNV='Universe'; DOC='WebIntellignceReport'; */  UNV='Universe';                                                        Universe