Redshift REGEXP_SUBSTR получить последнее совпадение - PullRequest
0 голосов
/ 29 мая 2020

У меня есть список событий страницы всех типов в значении столбца, упорядоченный по времени как c, который я получил с помощью метода listagg. listagg(page,';') within group (order by time)

Я хочу получить вхождение последнего совпадения, которое соответствует регулярному выражению regexp_substr(event_list,'/step[0-9]+[^;]*')

Согласно документам «Положительное целое число, которое указывает позицию в исходной_строке для начала поиска. Позиция зависит от количества символов, а не байтов, поэтому многобайтовые символы считаются одиночными. Значение по умолчанию - 1. Если позиция меньше 1, поиск начинается с первого символа исходной_строки. Если позиция больше, чем количество символов в исходной_строке, результатом будет исходная_строка. "

На основании этого мне нужно знать точное число вхождений, которое я не знаю. Как получить последний матч в этом случае? например: /step1;somethging;somethig;/step2;something;/step3;something;

Я хочу соответствовать шагу 3.

PS: Заказ по времени des c и получение первого совпадения здесь не вариант.

1 Ответ

1 голос
/ 31 мая 2020

Используйте regexp_count, чтобы определить количество совпадений (n), а затем используйте regexp_substr, чтобы получить n -ое совпадение.

select 
  '/step1;somethging;somethig;/step2;something;/step3;something;' string
, '/step[0-9]+[^;]*' pat
, regexp_count(string, pat) n
, regexp_substr(string, pat, 1, n) last_part

выводит:

                                                       string                pat    n    last_part
/step1;somethging;somethig;/step2;something;/step3;something;   /step[0-9]+[^;]*    3       /step3

если / можно рассматривать как разделитель, то вы можете альтернативно использовать следующую стратегию

перевернуть строку , разделить на / и взять первую часть. снова переверните, добавив префикс / и применив регулярное выражение для извлечения шага:

пример:

select 
  '/step1;somethging;somethig;/step2;something;/step3;something;' string
, '/' || reverse(split_part(reverse(string), '/', 1)) last_part
, regexp_substr(last_part, '/step[0-9]+[^;]*') extract_step

выходы:

                                                       string           last_part   extract_step 
/step1;somethging;somethig;/step2;something;/step3;something;   /step3;something;         /step3 
...