Получить 5 символов после последней косой черты

Мне нужны первые 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})[^/]*$

Wiktor Stribiżew 14.12.2020 23:56

Я думаю, вам нужно 6 символов, верно? ^.*/(.{6})regex101.com/r/ysmdud/1

The fourth bird 14.12.2020 23:57

«Я не думаю, что окружающая среда имеет значение». Всякий раз, когда вы публикуете вопрос о регулярном выражении, важно указывать язык программирования, инструмент или тип регулярного выражения, которые вы используете. Это связано с тем, что не все функции регулярных выражений поддерживаются всеми разновидностями. Синтаксис тоже может быть разным.

41686d6564 stands w. Palestine 15.12.2020 00:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
804
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете сопоставлять до последнего вхождения / с группой захвата и квантификатором {1,6} для сопоставления no или flaged

Обратите внимание, что flaged — это 6 символов вместо 5 после /.

На этой странице показано, как получить группу захвата из матча с помощью REGEXP_SUBSTR или REGEXP_REPLACE.

^.*/([^/]{1,6})[^/]*$

Объяснение

  • ^.*/ Убедитесь, что совпадает с последним вхождением /
  • ( Группа захвата 1
    • [^/]{1,6} Совпадите 6 раз с любым символом, кроме /
  • ) Закрыть группу 1
  • [^/]* Сопоставьте 0+ вхождений любого символа, кроме /
  • $ Конец строки

Посмотрите демонстрацию регулярных выражений

Это работает для всех сценариев, спасибо. Также похоже, что мой демонстрационный сайт регулярного выражения работает неправильно, поэтому я начну использовать ваше регулярное выражение для демонстрации/тестирования.

TPAKTOPA 15.12.2020 00:47

Вы можете использовать следующий код REGEXP_SUBSTR:

REGEXP_SUBSTR('people/capital/base/flagedbyloggers', '([^/]{1,6})[^/]*$', 1, 1, NULL, 1)

Посмотрите демонстрацию регулярного выражения . Подробности:

  • ([^/]{1,6}) - от одного до шести символов, кроме / (группа 1, последний аргумент в REGEXP_SUBSTR извлекает это значение)
  • [^/]*$ - любой ноль или более символов, кроме /, до конца строки.

Спасибо за ваш ответ, он работает для длинной последней строки, но не для более короткой. Также помогли параметры для функции. +1

TPAKTOPA 15.12.2020 00:31

@TPAKTOPA Я изменил квантификатор. На самом деле это не было проблемой, поскольку решение работало для текущей OP.

Wiktor Stribiżew 15.12.2020 00:50

Плохо, я отредактировал пост и позже добавил, что он должен работать и с более коротким текстом.

TPAKTOPA 15.12.2020 01:02

Если, кроме символов косой черты, это слова, вы можете использовать приведенный ниже оператор.

/(\w{5})\w*$

Демонстрация Regex101

Вам не нужно регулярное выражение. Вы можете использовать простые строковые функции:

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 15.12.2020 00:48

@TPAKTOPA Не гарантируется, что они будут универсальными; Oracle не поддерживает весь спектр синтаксиса регулярных выражений (например, вы не можете использовать незахватываемые группы или сопоставлять границы слов). Строковые функции довольно универсальны, они могут иметь разные имена между интерфейсом и сервером, но когда вы знаете, чего хотите достичь, то поиск подстроки длиной 6, начинающейся с символа после индекса последнего символа косой черты, будет довольно легко перевести из базы данных Oracle в Python/Java/C++/и т. д. (средний уровень) в JavaScript (на стороне клиента).

MT0 15.12.2020 00:54

Другие вопросы по теме