-1

我有一段文字:

“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”

一些单词括在括号中,问题如何获得括号中所有单词的列表?

我期待一个结果:

"amet"
"nulla"
"enim"

我尝试使用正则表达式 REGEXP_SUBSTR,但我只能检索一个单词(第 n 个元素)。如何获取括号中单词数可能不同的所有单词。

4

2 回答 2

4

您不需要正则表达式,您可以在递归子查询因式分解子句中使用简单(更快)的字符串函数(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;

两个输出:

STR
亚美特
恩尼姆

db<>在这里摆弄

于 2021-07-12T21:42:21.360 回答
1

我不够聪明,无法使用 SQL(包括正则表达式)来做到这一点。但是,如果您没有更好的东西,请查看功能是否有帮助。

SQL> create or replace function f_test (par_str in varchar2) return sys.odcivarchar2list is
  2    retval sys.odcivarchar2list := sys.odcivarchar2list();
  3    l_str  varchar2(20);
  4  begin
  5    for i in 1 .. (regexp_count(par_str, '{') / 2) + 1 loop
  6      l_str := substr(par_str, instr(par_str, '{', 1, i) + 1,
  7                               instr(par_str, '}', 1, i) - instr(par_str, '{', 1, i) - 1
  8                     );
  9      retval.extend;
 10      retval(i) := l_str;
 11    end loop;
 12    return retval;
 13  end;
 14  /

Function created.

SQL>

测试:

SQL> select * from table(f_test('&col'));
Enter value for col: Lorem ipsum dolor sit {amet} augue egestas blandit, quam. Phasellus vitae arcu dolor, scelerisque vel, purus. Aliq
uam id {nulla} luctus et lacus quis neque. Nam {enim}. Etiam tincidunt tempus.

COLUMN_VALUE
------------------------------------------------------------
amet
nulla
enim

SQL>
于 2021-07-12T21:19:03.060 回答