2013-01-14 35 views
3

我想要找出最好的regex以僅匹配URL中的最後兩個字符串。用於匹配URL的最後兩部分的正則表達式

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

我有問題是一些字符串可以有大量的例如週期

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

也應該只返回yimg.com

我正在使用的URL集不是h ave任何路徑信息,所以人們可以假設字符串的最後部分始終是.org.com或某種性質的東西。

時對www.stackoverflow.com運行和返回時yimg.com對a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com 下運行什麼正規表示將返回stackoverflow.com上面的條件?

+1

?你有什麼嘗試? –

+1

你確定你的意思是'URL'嗎?聽起來更像'主機'。 – Prinzhorn

+0

您是否需要支持以「.co.uk」或類似方式結尾的域名? –

回答

1

我不知道你到目前爲止做了什麼,但我可以提供以下解決方案:

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

這裏有幾個技巧:

  1. 使用$匹配到字符串的末尾。這樣你就可以確定你的正則表達式引擎不會從一開始就捕捉到匹配。 (...)中的分組。事實上,它意味着以下內容:匹配包含至少一個字母的單詞,然後應該有一個點(反斜槓,因爲點在正則表達式中有特殊的含義,我們希望它是'原樣',然後再一系列字母至少有一個字母)。

  2. 使用在模式的開頭不情願的搜索,因爲否則會在一個貪婪的方式匹配的一切,例如,如果你的文字是:

    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 

希望這有助於

+0

以及包含數字等的網址怎麼樣似乎並沒有涵蓋這些情況 – akhilless

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]); 

此正則表達式保證你去取網址+域名的最後部分。例如,具有a-abcnewsplus.i-a277eea3.rtmp.atlas.cdn.yimg.com這產生

yimg.com 

作爲輸出,並用www.stackoverflow.com(有或無三瓦特前述)它給你

stackoverflow.com 

結果

0

一個較短的版本

/(\.[^\.]+){2}$/ 
您正在使用哪種語言