Как использовать регулярное выражение для разделения с использованием последнего вхождения косой черты в BigQuery

#google-bigquery

#google-bigquery

Вопрос:

У меня есть образец данных в виде

 with temp_table as 
(
select "/category/sub-category/title-of-the-page"  as pagename
union all
select "premier-league/splash"
union all
select "portal" 
union all 
select "news/1970/01/01/new-billion"
union all 
select "/premier-league/transfers/"
union all 
select "/premier-league/tfflive"
)

, clean_pagename as
(
select * , 
if (regexp_contains(pagename, "^/ " ) , regexp_extract(pagename, "^/ (.*)/?$") , pagename) as clean_page
from temp_table   
)

, dated_content as
(
select *, if (
regexp_contains(clean_page , "/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/") , 
regexp_replace(clean_page , "[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]", "dated-content" ),
clean_page
) as  new_pagename
from clean_pagename 
)

,category_and_titles as
(
select *, split(new_pagename, "/")[offset(0)] as page_category,
coalesce(REGEXP_EXTRACT(new_pagename, r'/([^/] )?$') , "no-title") as title,
regexp_replace(new_pagename, r'[^/] $', "") as path
from dated_content 
)

select pagename,
page_category ,
path,
title
from category_and_titles 
  

Вот что я делаю — я удаляю первое / в строке и заменяю содержимое даты с помощью регулярного выражения. Далее я хотел бы извлечь 3 вещи

  1. категория — первый раздел строки перед первым /
  2. путь — был обнаружен компонент строки от 0 до последнего /
  3. заголовок — все, что после последнего / в строке.

Есть случаи, когда / ее вообще нет (запись # 3). В этом случае я хочу, чтобы все 3 части были равны исходной строке.

Например, для string as /premier-league/transfers/ я бы хотел, чтобы мой вывод был —

 category = "premier-league" , path = "premier-league/transfers/" , title = ""
  

Мой текущий код выдает мне результаты в виде

вывод

Принимая во внимание, что мне нужно —

желаемый вывод

Ответ №1:

Без особого рефакторинга и оставляя всю вашу исходную логику нетронутой — просто внесите следующие изменения для category_and_titles CTE

 ...
, category_and_titles AS (
  SELECT *, 
    SPLIT(new_pagename, "/")[OFFSET(0)] AS page_category,
    IF(REGEXP_CONTAINS(new_pagename, r'/'), REGEXP_REPLACE(new_pagename, r'[^/] $', ""), new_pagename)  AS path,
    IF(REGEXP_CONTAINS(new_pagename, r'/'), COALESCE(REGEXP_EXTRACT(new_pagename, r'/([^/] )?$'), "no-title"), new_pagename) AS title
  FROM dated_content 
)
...
  

с этим незначительным изменением результат будет таким, как ожидалось

введите описание изображения здесь