Oracle SQL:在两个字符之间提取文本

时间:2018-04-24 14:43:44

标签: sql regex oracle substring

我的字符串看起来像

{ABCDE}{F1}
{GHIJ}{K12}

我想在第一个大括号

之间提取文本
ABCDE
GHIJ

我尝试在线搜索,但很多答案似乎都在使用函数或PL-SQL。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:6)

我们可以在这里使用REGEXP_SUBSTR

SELECT regexp_substr('{ABCDE}{F1}', '\{([^}]+)\}', 1,1,NULL,1) AS output
FROM dual

Demo

根据这种模式,这是使用捕获组的REGEXP_SUBSTR不太常见的用法:

\{([^}]+)\}

第六个参数表示返回第一个捕获组。

答案 1 :(得分:3)

这是旧skool。我喜欢正则表达式并能理解它们,但是当我尝试制作它们时会遇到很多麻烦。有点像西班牙语(对我而言)。所以这只是SQL INSTR / SUBSTR / REPLACE。我不期待任何赞成......

WITH test_data (raw_text)
 AS 
  (SELECT '{ABCDE}{F1}' from dual UNION ALL
   SELECT '{GHIJ}{K12}' from dual 
  )
SELECT
 raw_text
,SUBSTR(raw_text,2,INSTR(raw_text,'}{')-2)              first_string
,REPLACE(SUBSTR(raw_text,INSTR(raw_text,'}{')+2),'}')   second_string
--these two from Tim's excellent answer
,regexp_substr(raw_text, '\{([^}]+)\}', 1,1,NULL,1) 
,regexp_substr(raw_text, '\{([^}]+)\}', 1,2,NULL,1)
FROM
 test_data
;

Demo

答案 2 :(得分:1)

您可以尝试以下内容:

SELECT TRIM( '{' FROM REGEXP_SUBSTR(mystring, '\{[^}]+') )
  FROM mytable;

这将从第一个开口大括号中捕获文本,但不包括结束大括号,然后从结果中修剪开始大括号。

希望这有帮助。