红移REGEXP_SUBSTR获得匹配的最后一次出现



>我在使用 listagg 方法获得的按时间 asc 排序的列值中列出了所有类型的页面事件。listagg(page,';') within group (order by time)

我想获取与正则表达式匹配的最后一个匹配项的出现次数regexp_substr(event_list,'/step[0-9]+[^;]*')

根据文档"一个正整数,指示source_string内开始搜索的位置。该位置基于字符数,而不是字节数,因此多字节字符计为单个字符。默认值为 1。如果位置小于 1,则从 source_string 的第一个字符开始搜索。如果位置大于source_string中的字符数,则结果为 source_string。

基于此,我需要知道我不知道的确切发生次数。 在这种情况下,如何获得最后一场比赛? 例如:/step1;somethging;somethig;/step2;something;/step3;something;

我想匹配步骤 3。

PS:按时间描述排序并获得第一场比赛在这里不是一个选项。

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

最新更新