我想查询https://或http://与它后面的第一个分隔符之间的字符串。例如,如果该字段包含:
https://google.com/en/
https://www.yahoo.com?en/
我想得到:
google.com
www.yahoo.com
我将捕获/
的初始查询仅包含两个substring_index,如下所示:
SELECT substring_index(substring_index(mycol,'/',3),'://',-1)
FROM mytable;
现在,我发现URL可能包含多个分隔符。我想让自己的角色捕捉到多个可能的分界符(每个分界符是一个单独的角色):
:/?#[]@!$&'()*+,;=
如何在我的陈述中这样做?我尝试了this solution,但是最终结果由于语法错误而无法执行命令,但是我确定我遵循了解决方案。谁能帮助我正确地构建查询以捕获上面列出的所有分隔符?
我在Ubuntu 18.04上使用MySQL workbecnh 6.3。
编辑:
在第一个URL示例中进行了一些更正。
答案 0 :(得分:0)
在MySQL 8+中,这应该起作用:
SELECT regexp_replace(regexp_substr(mycol, '://[a-zA-Z0-9_.]+[/:?]'), '[^a-zA-Z0-9_.]', '')
FROM (SELECT 'https://google.com/en' as mycol union all
SELECT 'https://www.yahoo.com?en'
) x
在旧版本中,这更具挑战性,因为无法搜索字符串类。
一种蛮力方法是:
select (case when substring_index(mycol, '://', -1) like '%/%'
then substring_index(substring_index(mycol, '://', -1), '/', 1)
when substring_index(mycol, '://', -1) like '%?%'
then substring_index(substring_index(mycol, '://', -1), '?', 1)
. . . -- and so on for each character
else substring_index(mycol, '://', -1)
end) as what_you_want
[a-zA-Z0-9_.]
的目的类似于您的域名的有效字符类。
答案 1 :(得分:0)
首先,请注意https://www.yahoo.com?en/
似乎是不太可能的URL,因为它在查询字符串中包含路径分隔符。无论如何,如果您使用的是MySQL 8+,请考虑使用其regex功能。 REGEXP_REPLACE
函数在这里可以使用以下模式提供帮助:
https?://([A-Za-z_0-9.-]+).*
示例查询:
WITH yourTable AS (
SELECT 'https://www.yahoo.com?en/' AS url UNION ALL
SELECT 'no match'
)
SELECT
REGEXP_REPLACE(url, 'https?://([A-Za-z_0-9.-]+).*', '$1') AS url
FROM yourTable
WHERE url REGEXP 'https?://[^/]+';
术语$1
指的是正则表达式模式中的第一个 capture 组。显式捕获组由括号中的数量表示。在这种情况下,这是捕获组(在下面突出显示):
https?://([A-Za-z_0-9.-]+).*
^^^^^^^^^^^^^^^
也就是说,捕获组是URL路径的第一部分,包括域,子域等。