给定一串键值对:/* USER='Administrator'; UNV='Universe'; DOC='WebIntellignceReport'; */
我的目标是提取与USER
,UNV
和DOC
键相关联的值。
使用(?<=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
我错过了什么?
答案 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。
使用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