我有一个包含网站网址的数据库。从那些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/
我想摆脱/
。我该怎么做?
答案 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
答案 4 :(得分:0)
为什么不使用(http)uritype并从中提取主机?
答案 5 :(得分:0)