3

我试图找出regex仅匹配 url 中最后两个字符串的最佳方法。

例如www.stackoverflow.com我只想匹配stackoverflow.com

我遇到的问题是一些字符串可以有大量的句点,例如

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

也应该只返回yimg.com

我正在使用的 URL 集没有任何路径信息,因此可以假设字符串的最后一部分总是.org.com或某种性质的东西。

什么正则表达式在针对 www.stackoverflow.com 运行时会返回 stackoverflow.com,而在上述条件下针对 a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com 运行时会返回 yimg.com?

4

4 回答 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最终的输出。

希望这可以帮助。

于 2013-01-14T06:14:58.963 回答
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

因此

于 2013-01-14T06:24:01.903 回答
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

希望这可以帮助

于 2013-01-14T06:32:08.880 回答
0

较短的版本

/(\.[^\.]+){2}$/
于 2013-02-01T15:52:31.067 回答