/abc/required_string/2/ должен вернуть abc с regexp_substr
regexp_substr разделяет текст между первой косой чертой и второй
Ответы (4)
Вы можете попробовать следующее:
SELECT TRIM('/' FROM REGEXP_SUBSTR(mycolumn, '^\/([^\/]+)'))
FROM mytable;
Это регулярное выражение будет соответствовать первому вхождению шаблона, начинающегося с /
(я обычно экранирую /
в регулярных выражениях, следовательно, \/
, что ничего не испортит) и включает все последующие символы, отличные от /
. Если таких символов нет, то он вернет NULL
.
Надеюсь это поможет.
Вы можете искать /([^/]+)/
, который говорит:
/
косая черта(
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.
Классические 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>
Вот еще один способ получить второе вхождение строки символов, за которой следует косая черта. Он решает проблему, если этот элемент также имеет значение 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;