匹配URL中最后两部分的正则表达式

3

我正在尝试确定最佳的正则表达式,只匹配 url 中的最后两个字符串。

例如,在 www.stackoverflow.com 中,我只想匹配 stackoverflow.com

问题在于,某些字符串可能会有大量的句点,例如

a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com 

当我处理的URL集合没有任何路径信息时,可以假设字符串的最后一部分始终是.org.com或类似的内容。

在上述条件下,运行哪个正则表达式将返回 stackoverflow.com 以及在运行a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com时返回 yimg.com


1
你在使用哪种编程语言?你尝试过什么? - Rohit Jain
1
你确定你是指 URL 吗?听起来更像是 host - Prinzhorn
您需要支持以“.co.uk”或类似方式结尾的域名吗? - Marc Baumbach
如果你的编程语言有URL功能,你可以使用它来提取主机名,然后使用一些简单的indexOf方法来提取出来。 - nhahtdh
我建议查看https://dev59.com/0nVC5IYBdhLWcg3wcwwm,因为该答案提供了有关解析域名的复杂性的详细信息。 - Marc Baumbach
4个回答

3

您不必使用正则表达式,而是可以使用简单的 explode 函数。

因此,您要将 URL 在句点处分割,例如:

$url = "a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com";
$url_split = explode(".",$url);

然后您需要获取最后两个元素,这样您就可以从创建的数组中输出它们。
//this will return the second to last element, yimg
echo $url_split[count($url_split)-2];
//this will echo the period
echo ".";
//this will return the last element, com
echo $url_split[count($url_split)-1];

最终你会得到yimg.com作为最终输出结果。希望这可以帮助你。

1
如果您需要一种在多种语言中都能兼容 Perl 正则表达式的解决方案,您可以使用类似以下 PHP 示例的方法。
$url = "a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com";

preg_match('|[a-zA-Z-0-9]+\.[a-zA-Z]{2,3}$|', $url, $m);
print($m[0]);

这个正则表达式可以确保您获取URL +域名的最后一部分。例如,使用a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com将产生以下结果:

yimg.com

作为输出,使用www.stackoverflow.com(前缀三个w与否均可),它将给您返回结果。
stackoverflow.com

结果


1

我不知道你到目前为止尝试了什么,但我可以提供以下解决方案:

/.*?([\w]+\.[\w]+)$/

这里有几个技巧:

  1. 使用 $ 匹配到字符串的结尾。这样你就可以确保你的正则表达式引擎不会从一开始就捕获匹配。

  2. 在 (... ) 中使用分组。实际上,它的意思是:匹配包含至少一个字母的单词,然后应该有一个点(反斜杠因为点在正则表达式中具有特殊意义,我们想要它“原样”),然后再次是至少一个字母的系列)。

  3. 在模式的开头使用勉强搜索,否则它将以贪婪的方式匹配所有内容,例如,如果您的文本是:

    abc.def.gh

贪婪匹配将在您的组中给出 f.gh,这不是您想要的。

我假设您的主机中只能有字母(\w 匹配单词,在您的示例中可能需要更复杂的内容)。

我在此发布了一个可行的 Groovy 示例,您没有指定您使用的语言,但引擎应该是类似的。

def  s = "abc.def.gh"
def m = s =~/.*?([\w]+\.[\w]+)$/
println m[0][1] // outputs the first (and the only you have) group in groovy

希望这能有所帮助。

那么包含数字等字符的URL呢?似乎 [\w] 无法覆盖这些情况。 - akhilless

0

一个更短的版本

/(\.[^\.]+){2}$/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接