3

我正在尝试在 Oracle 存储过程中使用字符串作为分隔符来拆分字符串。我可以instr轻松使用,但我正在尝试学习如何使用正则表达式来做到这一点,因为我知道它功能强大且高效。

在阅读了一些文章之后,我认为我可以这样做(预期结果是“ Hello”):

select regexp_substr('Hello My Delimiter World', '( My Delimiter )+', 1, 1)
from dual

结果:

我的分隔符

和(预期结果是“ World”):

  select regexp_substr('Hello My Delimiter World', '( My Delimiter )+', 1, 2)
    from dual

结果:

空值

此要求的正确 regex_substr 是什么?

编辑:我正在寻找类似下面的东西。在单遍中,它选择字符串中的子字符串:

例如 selectregexp_substr('Hello World', '[^ ]+', 1, 2) from dual但此示例仅适用于单个字符。

4

1 回答 1

5

试试这些方法。

这将获得您最初要求的第一个元素:

SQL> with tbl(str) as (
      select 'Hello My Delimiter World' from dual
    )
    SELECT REGEXP_SUBSTR( str ,'(.*?)( My Delimiter |$)', 1, 1, NULL, 1 ) AS element
    FROM   tbl;

ELEME
-----
Hello

此版本解析整个字符串。添加了 NULL 元素以显示它适用于缺少的元素:

SQL> with tbl(str) as (
      select ' My Delimiter Hello My Delimiter World My Delimiter  My Delimiter test My Delimiter ' from dual
    )
    SELECT LEVEL AS element,
    REGEXP_SUBSTR( str ,'(.*?)( My Delimiter |$)', 1, LEVEL, NULL, 1 ) AS element_value
    FROM   tbl
    CONNECT BY LEVEL <= regexp_count(str, ' My Delimiter ')+1;

   ELEMENT ELEMENT_VALUE
---------- --------------------
         1
         2 Hello
         3 World
         4
         5 test
         6

6 rows selected.
于 2015-07-27T17:55:17.773 回答