Как использовать регулярное выражение для разделения с использованием последнего появления косой черты в BigQuery - PullRequest
0 голосов
/ 27 марта 2019

У меня есть пример данных как

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. title - все, что находится после последней / в строке.

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

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

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

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

output

В то время как мне нужно -

desired_output

1 Ответ

2 голосов
/ 27 марта 2019

Без особых усилий по рефакторингу и оставлению всей вашей исходной логики без изменений - просто выполните следующие изменения для 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 
)
...

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...