Как я могу использовать регулярное выражение для разделения строки, используя строку в качестве разделителя?

Я пытаюсь разбить строку, используя строку в качестве разделителя, в процедуре хранения 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 для этого требования?

РЕДАКТИРОВАТЬ: я ищу что-то вроде ниже. За один проход он выбирает подстроку в строке:

Например. выберите regexp_substr('Hello World', '[^ ]+', 1, 2) from dual Но этот образец работает только с одним символом.


person Zesty    schedule 08.06.2015    source источник
comment
Если вы можете сделать что-то просто с помощью обычных строковых функций, обычно регулярные выражения не более эффективны или мощны. Они не то, что вы должны стремиться использовать просто так.   -  person Sami Kuhmonen    schedule 08.06.2015
comment
Регулярные выражения не более эффективны, чем обычные функции SUBSTR и INSTR. Они потребляют ресурсы и интенсивно используют ЦП. Единственный случай, когда регулярное выражение кажется полезным, — это когда у вас есть сложный запрос, и вы можете сократить его с помощью функций регулярного выражения.   -  person Lalit Kumar B    schedule 08.06.2015
comment
Спасибо, будем иметь в виду.   -  person Zesty    schedule 08.06.2015


Ответы (1)


Попробуйте эти методы.

Это получает первый элемент, как вы изначально просили:

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.
person Gary_W    schedule 27.07.2015