Мне нужны первые 5 символов после последней косой черты. Я могу получить все символы после косой черты, но не могу взять только первые 5 из них.
REGEX_SUBSTR('people/capital/base/flagedbyloggers','[^/]*$')
С [^/]*$
я получаю flagedbyloggers
, но мне нужно только flaged
, первые 5 символов.
С [^/]{5}$
я получаю ggers
, то есть 5 последних символов после последней косой черты, но мне нужно flaged
, первые 5 символов после последней косой черты.
Также иногда строка после последней косой черты может быть короче, поэтому она должна работать с менее чем 5 символами, например. people/capital/base/no
должен вернуться только no
.
Среда - база данных ORACLE. Такой же результат у меня с онлайн-инструментом https://regexr.com/.
Я думаю, вам нужно 6 символов, верно? ^.*/(.{6})
regex101.com/r/ysmdud/1
«Я не думаю, что окружающая среда имеет значение». Всякий раз, когда вы публикуете вопрос о регулярном выражении, важно указывать язык программирования, инструмент или тип регулярного выражения, которые вы используете. Это связано с тем, что не все функции регулярных выражений поддерживаются всеми разновидностями. Синтаксис тоже может быть разным.
Вы можете сопоставлять до последнего вхождения /
с группой захвата и квантификатором {1,6}
для сопоставления no
или flaged
Обратите внимание, что flaged
— это 6 символов вместо 5 после /
.
^.*/([^/]{1,6})[^/]*$
Объяснение
^.*/
Убедитесь, что совпадает с последним вхождением /
(
Группа захвата 1
[^/]{1,6}
Совпадите 6 раз с любым символом, кроме /
)
Закрыть группу 1[^/]*
Сопоставьте 0+ вхождений любого символа, кроме /
$
Конец строкиПосмотрите демонстрацию регулярных выражений
Это работает для всех сценариев, спасибо. Также похоже, что мой демонстрационный сайт регулярного выражения работает неправильно, поэтому я начну использовать ваше регулярное выражение для демонстрации/тестирования.
Вы можете использовать следующий код REGEXP_SUBSTR:
REGEXP_SUBSTR('people/capital/base/flagedbyloggers', '([^/]{1,6})[^/]*$', 1, 1, NULL, 1)
Посмотрите демонстрацию регулярного выражения . Подробности:
([^/]{1,6})
- от одного до шести символов, кроме /
(группа 1, последний аргумент в REGEXP_SUBSTR
извлекает это значение)[^/]*$
- любой ноль или более символов, кроме /
, до конца строки.Спасибо за ваш ответ, он работает для длинной последней строки, но не для более короткой. Также помогли параметры для функции. +1
@TPAKTOPA Я изменил квантификатор. На самом деле это не было проблемой, поскольку решение работало для текущей OP.
Плохо, я отредактировал пост и позже добавил, что он должен работать и с более коротким текстом.
Если, кроме символов косой черты, это слова, вы можете использовать приведенный ниже оператор.
/(\w{5})\w*$
Вам не нужно регулярное выражение. Вы можете использовать простые строковые функции:
SELECT SUBSTR( value, INSTR( value, '/', -1 ) + 1, 6 ) AS substring
FROM table_name;
Что для примера данных:
CREATE TABLE table_name ( value ) AS
SELECT 'people/capital/base/flagedbyloggers' FROM DUAL;
Выходы:
| SUBSTRING | | :-------- | | flaged |
db<>рабочий пример здесь
Спасибо за ваш ответ. Я предпочитаю регулярные выражения, потому что они универсальны и могут быть повторно использованы в коде бэкэнда/внешнего интерфейса. +1
@TPAKTOPA Не гарантируется, что они будут универсальными; Oracle не поддерживает весь спектр синтаксиса регулярных выражений (например, вы не можете использовать незахватываемые группы или сопоставлять границы слов). Строковые функции довольно универсальны, они могут иметь разные имена между интерфейсом и сервером, но когда вы знаете, чего хотите достичь, то поиск подстроки длиной 6, начинающейся с символа после индекса последнего символа косой черты, будет довольно легко перевести из базы данных Oracle в Python/Java/C++/и т. д. (средний уровень) в JavaScript (на стороне клиента).
Что такое окружающая среда? Попробуйте ([^/]{6})[^/]*$