从Oracle SQL中的URL获取域

时间:2014-01-11 15:25:40

标签: sql regex oracle

我有一个包含网站网址的数据库。从那些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.(删除它)。然后我使用substring来获取开头和第一个/之间的字符串,或者如果整个字符串没有/。我的代码如下所示:

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

除了我的正则表达式无法排除/之外,所有内容都按预期工作:

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

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

6 个答案:

答案 0 :(得分:5)

使用此:

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                 |

答案 1 :(得分:4)

感谢答案中的提示,我终于开始工作了!

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

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

感谢大家的帮助!

答案 2 :(得分:1)

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

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

如果没有,那么这一个:

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

答案 3 :(得分:0)

您可以使用以下正则表达式匹配字符串末尾的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

Source

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我已经尝试了所有提交的答案,但是它们没有用。 这是一张图片,您可以确定输出什么都不是。 enter image description here