繁体   English   中英

如何在substring_index中传递多个分隔符

[英]How to pass multiple delimeters in substring_index

我想查询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可能包含多个分隔符。 我希望我的statament捕获多个delimeters的可能性(每个都是一个单独的字符):

:/?#[]@!$&'()*+,;=

在我的陈述中如何做到这一点? 我尝试了这个解决方案,但最终结果是由于语法错误导致命令无法执行,而我确信我已经按照解决方案。 任何人都可以帮我正确构建查询以捕获我上面列出的所有分隔符字符?

我在Ubuntu 18.04上使用MySQL workbecnh 6.3。

编辑:

在第一个URL示例中进行了一些更正。

在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_.]旨在与您的域名的有效字符类相似。

首先,请注意https://www.yahoo.com?en/似乎是一个不太可能的URL,因为它在查询字符串中包含一个路径分隔符。 无论如何,如果您使用的是MySQL 8+,请考虑使用其正则表达式功能。 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指的是正则表达式模式中的第一个捕获组。 显式捕获组由括号中的数量表示。 在这种情况下,这里是捕获组(下面突出显示):

https?://([A-Za-z_0-9.-]+).*
          ^^^^^^^^^^^^^^^

也就是说,捕获组是URL路径的第一部分,包括域,子域等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM