用于从公用名称查找域的SQL正则表达式

用于从公用名称查找域的SQL正则表达式,sql,regex,oracle,Sql,Regex,Oracle,我的一个表中有以下示例数据集: sub1.domain.com domain.com sub1.sub2.domain.com *.domain.com 已更新 还包括ccTLD *.domain.co.uk Oracle中的/regex是否有一种方法可以帮助我从字符串中提取域名-“domain.com”。我已经尝试了一些regex,但效果不佳。 感谢您的帮助您可以使用下面的正则表达式匹配字符串末尾的某物(不带点)。某物(不带点)。你将在第一组中得到答案。如果您还需要TLD,您可以将除$之外

我的一个表中有以下示例数据集:

sub1.domain.com
domain.com
sub1.sub2.domain.com
*.domain.com

已更新
还包括ccTLD
*.domain.co.uk



Oracle中的/regex是否有一种方法可以帮助我从字符串中提取域名-“domain.com”。我已经尝试了一些regex,但效果不佳。
感谢您的帮助

您可以使用下面的正则表达式匹配字符串末尾的某物(不带点)。某物(不带点)。你将在第一组中得到答案。如果您还需要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

当我输入答案时,上面的人给出了一个很好的正则表达式。我想您可以在select语句中使用REGEXP\u REPLACE

REGEXP_REPLACE(fieldname, '([^.]+)\.([^.]+)$', '\1\.\2') as fieldname

这将产生零效果,因为匹配的部分将被自身替换。感谢William…我尝试从dual中选择REGEXP\u REPLACE('abc.domain.com','([^.]+)\。([^.]+)$,'\1\.\2');它将输出为abc.domain\.com是的,不必在替换字符串中转义点。如果更正,它将给出相同的字符串,因为
REGEXP\u replace
的替换操作
uk
是ccTLD,而不是
co.uk
。如果你想得到
domain.co.uk
,你必须单独说明,因为我们无法区分
sub1.domain.com
domain.co.uk
之间的区别。我已经更新了
co.uk
的答案,使之成为通用的(TLD和CCTLD)可能我需要在正则表达式中添加所有的ccTLD…@Anup ccTLD与其他TLD一样。它们位于FQDN的末尾。因此,我认为他们不需要特殊的治疗,除非前面的子域必须像
co.uk
那样包含在结果中,其中
co
。我的意思是
uk
是ccTLD,而不是
co.uk