regexp_substr разделяет текст между первой косой чертой и второй

/abc/required_string/2/ должен вернуть abc с regexp_substr


person dreambigcoder    schedule 18.04.2018    source источник
comment
Возможный дубликат Изучение регулярных выражений   -  person Biffen    schedule 18.04.2018


Ответы (4)


Вы можете попробовать следующее:

SELECT TRIM('/' FROM REGEXP_SUBSTR(mycolumn, '^\/([^\/]+)'))
  FROM mytable;

Это регулярное выражение будет соответствовать первому вхождению шаблона, начинающегося с / (я обычно экранирую / в регулярных выражениях, следовательно, \/, что ничего не испортит) и включает все последующие символы, отличные от /. Если таких символов нет, то он вернет NULL.

Надеюсь это поможет.

person David Faber    schedule 23.04.2018

Вы можете искать /([^/]+)/, который говорит:

  • / косая черта
  • ( start of subexpression (usually called "group" in other languages)
    • [^/] any character other than forward slash
    • + соответствует предыдущему выражению один или несколько раз
  • ) конец подвыражения
  • / косая черта

Вы можете использовать 6-й аргумент для regexp_substr для выбора подвыражения. Здесь мы передаем 1, чтобы сопоставить только символы между /:

select  regexp_substr(txt, '/([^/]+)/', 1, 1, null, 1)
from    t1

Посмотрите, как это работает в SQL Fiddle.

person Andomar    schedule 18.04.2018

Классические SUBSTR + INSTR предлагают простое решение; Я знаю, что вы указали регулярные выражения, но учтите, что это тоже может работать лучше для больших объемов данных.

SQL> with test (col) as
  2    (select '/abc/required_string/2/' from dual)
  3  select substr(col, 2, instr(col, '/', 1, 2) - 2) result
  4  from test;

RES
---
abc

SQL>
person Littlefoot    schedule 18.04.2018

Вот еще один способ получить второе вхождение строки символов, за которой следует косая черта. Он решает проблему, если этот элемент также имеет значение NULL. Всегда ожидайте неожиданного!

Примечание. Если вы используете форму регулярного выражения [^/]+, и этот элемент имеет значение NULL, он вернет «требуемую строку», а это НЕ то, что вы ожидаете! Эта форма НЕ обрабатывает элементы NULL. Подробнее см. здесь: [https://stackoverflow.com/a/31464699/2543416]

with tbl(str) as (
  select '/abc/required_string/2/' from dual union all
  select '//required_string1/3/' from dual
)
select  regexp_substr(str, '(.*?)(/)', 1, 2, null, 1)
from    tbl;
person Gary_W    schedule 18.04.2018