您不需要正则表达式,您可以在递归子查询因式分解子句中使用简单(更快)的字符串函数(INSTR和)来完成:SUBSTR
WITH bounds ( value, start_pos, end_pos ) AS (
SELECT value,
INSTR(value, '{', 1),
CASE INSTR(value, '{', 1)
WHEN 0
THEN 0
ELSE INSTR(value, '}', INSTR(value, '{', 1) + 1)
END
FROM table_name
UNION ALL
SELECT value,
INSTR(value, '{', end_pos + 1),
CASE INSTR(value, '{', end_pos + 1)
WHEN 0
THEN 0
ELSE INSTR(value, '}', INSTR(value, '{', end_pos + 1) + 1)
END
FROM bounds
WHERE start_pos > 0
AND end_pos > 0
)
SELECT SUBSTR( value, start_pos + 1, end_pos - start_pos - 1 ) AS str
FROM bounds
WHERE start_pos > 0
AND end_pos > 0;
如果您真的想使用(较慢的)正则表达式,那么:
SELECT str
FROM table_name t
CROSS APPLY (
SELECT REGEXP_SUBSTR(value, '\{(.*?)\}', 1, LEVEL, NULL, 1) AS str
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(value, '\{(.*?)\}')
)
其中,对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT 'Lorem ipsum dolor sit {amet} augue egestas blandit, quam. Phasellus vitae arcu dolor, scelerisque vel, purus. Aliquam id {nulla} luctus et lacus quis neque. Nam {enim}. Etiam tincidunt tempus. Quisque adipiscing iaculis' FROM DUAL;
两个输出:
db<>在这里摆弄