在 Oracle SQL 中从 URL 获取域

Get domain from URL in Oracle SQL

提问人:Foaly 提问时间:1/11/2014 更新时间:5/8/2019 访问量:11288

问:

我有一个包含网站 URL 的数据库。我想从这些URL中提取域名。这里有两个(安静不同的)例子:

http://www.example.com       -> example.com
example.co.uk/dir/index.html -> example.co.uk

为此,我使用了正则表达式以及 Oracle 提供的函数 REGEXP_SUBSTR 和 REGEXP_REPLACE。我正在使用 replace 替换前面的内容,并用空字符串替换(删除它)。然后,我使用子字符串来获取开头和第一个字符串之间的字符串,或者如果没有整个字符串。我的代码如下所示:http[s]www.//

REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '(.+?)(/|$)')

一切都按预期工作,除了我的正则表达式未能排除:/

example.com/dir/index.html -> example.com/

我想摆脱 .我该怎么做?/

SQL 正则表达式 Oracle

评论


答:

7赞 San 1/12/2014 #1

使用这个:

WITH tab AS 
 (SELECT 'https://www.example.co.uk/dir/index.html' AS website_url 
    FROM dual)
SELECT REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '\w+(\.\w+)+') 
  FROM tab;

输出:

|REGEXP_SUBSTR(REGEXP_REPLACE(W|
--------------------------------
|example.co.uk                 |

评论

0赞 Foaly 1/12/2014
这效果很好!谢谢。但可悲的是,它不适用于包含例如我尝试过的 URl 给出的 URL,但我无法修复它。你知道怎么做吗?-www.top.i-am-a-example.comtop.i
0赞 San 1/12/2014
增加允许的范围可能是解决这个问题的一种解决方案。REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '[a-z,A-Z,0-9,-]+(\.\w+)+')
0赞 Foaly 1/12/2014
是的,添加范围似乎是唯一的选择。使用你的代码我仍然得到.我不是正则表达式专家,所以我不知道为什么......对我来说看起来是正确的top.i
1赞 Sabuj Hassan 1/12/2014 #2

不确定 oracle 是否支持排除组。?:

REGEXP_REPLACE(website_url, '^(?:(?:http[s]?://)?www\.)?(.*?)(?:/.*|$)', '\1')

如果没有,那么这个:

REGEXP_REPLACE(website_url, '^((http[s]?://)?www\.)?(.*?)(/.*|$)', '\3')

评论

0赞 Foaly 1/12/2014
据我所知,Oracle 不支持预期的第二种工作,但不知何故它不适用于以下网址: 它返回:?:www.example.com/dir/index.htmlexample.comdir/index.html
0赞 Vignesh Kumar A 1/12/2014 #3

您可以使用以下正则表达式匹配字符串末尾的 something_without_a_dot.something_without_a_dot。你会在第一组中得到答案。如果您还需要 TLD,则可以将除 .()$

([^.]+)\.[^.]+$

在 SQL 中,这给出了:

SQL> select regexp_replace('sub1.sub2.domain.com', '^.*?([^.]+)\.[^.]+$', '\1') from dual;

REGEXP
------
domain

开头的非贪婪允许您忽略字符串的开头。.*?

要获取域名和 TLD:

SQL> select regexp_replace('sub1.sub2.domain.com', '^.*?([^.]+\.[^.]+)$', '\1') from dual;

REGEXP_REP
----------
domain.com

要考虑:co.uk

SQL> select regexp_replace('sub1.sub2.domain.co.uk', '^.*?([^.]+\.(co\.uk|[^.]+))$', '\1') from dual;

REGEXP_REPLA
------------
domain.co.uk

5赞 Foaly 1/12/2014 #4

多亏了答案中的提示,我终于让它工作了!

我现在使用的代码如下所示:

REGEXP_REPLACE(website_url, '(http[s]?://)?(www\.)?(.*?)((/|:)(.)*|$)', '\3')

感谢大家的帮助!

0赞 Tala 5/24/2016 #5

为什么不使用 (http)uritype 并从中提取主机?