【发布时间】:2018-10-04 21:12:16
【问题描述】:
我的字符串看起来像
{ABCDE}{F1}
{GHIJ}{K12}
我想提取第一个大括号之间的文本
ABCDE
GHIJ
我尝试在线搜索,但很多答案似乎是使用函数或 PL-SQL。有人可以帮我解决这个问题吗?
【问题讨论】:
-
阅读正则表达式。
标签: sql regex oracle substring
我的字符串看起来像
{ABCDE}{F1}
{GHIJ}{K12}
我想提取第一个大括号之间的文本
ABCDE
GHIJ
我尝试在线搜索,但很多答案似乎是使用函数或 PL-SQL。有人可以帮我解决这个问题吗?
【问题讨论】:
标签: sql regex oracle substring
我们可以在这里使用REGEXP_SUBSTR:
SELECT regexp_substr('{ABCDE}{F1}', '\{([^}]+)\}', 1,1,NULL,1) AS output
FROM dual
这是REGEXP_SUBSTR 的一种不太常见的用法,它使用捕获组,按照这种模式:
\{([^}]+)\}
第六个参数表示返回第一个捕获组。
【讨论】:
\} 是不必要的
这是老派。我喜欢正则表达式并且可以理解它们,但是当我尝试生成它们时遇到了很多麻烦。有点像西班牙语(对我来说)。所以这只是 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
;
【讨论】:
您可以尝试以下方法:
SELECT TRIM( '{' FROM REGEXP_SUBSTR(mystring, '\{[^}]+') )
FROM mytable;
这将捕获从第一个左大括号到但不包括右大括号的文本,然后从结果中修剪左大括号。
希望这会有所帮助。
【讨论】: