如何使用正则表达式将字符串以一个字符串为分隔符拆分?

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

结果:

null

这个要求正则表达式的正确regex_substr是什么?

编辑:我想找像下面这样的东西。在一次遍历中,它选择了字符串中的子字符串:

例如. 从双重选择 regexp_substr('Hello World', '[^ ]+', 1, 2) from dual 但这个示例只适用于单个字符。


1
如果你可以使用常规字符串函数简单地完成某些操作,通常正则表达式并不更有效或更强大。它们不是你应该仅仅因为而努力使用的东西。 - Sami Kuhmonen
1
“正则表达式”并不比常规的“SUBSTR”和“INSTR”函数更高效。它们会消耗资源,需要大量的CPU运算。唯一的情况是当您有一个复杂的查询,并且可以使用正则表达式功能缩短查询时,正则表达式似乎很有用。 - Lalit Kumar B
谢谢,我会记住的。 - Zesty
1个回答

6

请尝试以下方法。

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

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接