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

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

我有一个列值中所有类型的页面事件列表,该列值由我使用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 第四场比赛。

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

输出:

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

如果 / 可以被视为分隔符,那么您也可以采用以下策略
将字符串反转,按 / &第一部分。再次反转,加前缀 / 并应用正则表达式来提取步骤:
例子:

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

输出:

  1. string last_part extract_step
  2. /step1;somethging;somethig;/step2;something;/step3;something; /step3;something; /step3
展开查看全部

相关问题