redshift regexp\u substr获取匹配的最后一次出现

gupuwyp2  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(526)

我有一个列值中所有类型的页面事件列表,该列值由我使用listag方法得到的time asc排序。 listagg(page,';') within group (order by time) 我想得到与正则表达式匹配的最后一个匹配项的出现次数 regexp_substr(event_list,'/step[0-9]+[^;]*') 根据docs“一个正整数,表示源字符串中开始搜索的位置。位置基于字符数,而不是字节数,因此多字节字符被计为单个字符。默认值为1。如果位置小于1,则从源字符串的第一个字符开始搜索。如果位置大于源字符串中的字符数,则结果为源字符串。“
基于此,我需要知道确切的发生次数,我不知道。在这种情况下如何获得最后一个匹配?如: /step1;somethging;somethig;/step2;something;/step3;something; 我想匹配第三步。
注:按时间描述排序并获得第一个匹配项在这里不是一个选项。

gg58donl

gg58donl1#

使用 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

相关问题