Quiero extraer el slug de una URL usando expresiones regulares de SQL

https://example.com/december-2019/content/ this- is-the-slug /

Finalmente me encontré con esto

SELECT
regexp_extract(url, r'\/([a-z0-9_-]*[\/]?)$') slug
FROM table

Esto me da this-is-the-slug /

Sin embargo, solo quiero this-is-the-slug

Sé que puedo anidar mi consulta y eliminar el final '/', pero ¿hay algo que pueda agregar al RegExp '\/([a-z0-9_-]*[\/]?)$' anterior que lo haga todo en uno?

Además, ¿cómo funciona el RegExp? Estoy un poco confundido acerca de cómo funciona. Es algo como esto

$ # comienza al final de la cadena
/( ) # trabaja de nuevo y encuentra el primer '/' y crea un grupo de captura ()
[ ]* # crea un conjunto de caracteres [] en el grupo de captura y combina todos los elementos en él usando *
a-z0-9_- # coincide con todos estos caracteres en el conjunto de caracteres y retíralos.
¿[\/]? # tiene algo que ver con la correspondencia codiciosa? No estoy seguro de lo que esto hace.

Cualquier ayuda con esto sería genial. Gracias

0
cget 18 dic. 2019 a las 18:53

2 respuestas

La mejor respuesta

Aquí hay una opción sin expresiones regulares que utiliza la función SPLIT():

SELECT ARRAY_REVERSE(SPLIT(RTRIM(url, '/'), '/'))[SAFE_OFFSET(0)]
FROM yourTable;

Este enfoque elimina el separador de ruta final /, luego divide la URL en / para generar una matriz. Tenga en cuenta que usamos RTRIM para este propósito. Esto significa que la entrada de URL no se verá afectada si no tiene un separador de ruta final. Se retiene la última entrada en esa matriz, que debería ser la babosa.

1
Tim Biegeleisen 18 dic. 2019 a las 16:09

Todavía recomendaría usar REGEXP en casos como el suyo; su expresión regular era muy parecida a la que debería ser; solo necesita mover /? fuera del grupo capturado como en el ejemplo a continuación

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'https://example.com/december-2019/content/this-is-the-slug1/' url UNION ALL
  SELECT 'https://example.com/december-2019/content/this-is-the-slug2' 
)
SELECT 
  REGEXP_EXTRACT(url, r'\/([a-z0-9_-]*?)/?$') slug
FROM `project.dataset.table`  

Con resultado

Row slug     
1   this-is-the-slug1    
2   this-is-the-slug2    
0
Mikhail Berlyant 18 dic. 2019 a las 16:46