2013-10-22 48 views
2

我試圖域分成不同的類別(子域,域,TLD)時遇到了問題..正則表達式對域的匹配不同部分

我不能想出一個辦法,以匹配任何數量的的子域名,而不是超過我的域名或TLD mathcing。我正在使用PCRE正則表達式。

當前正則表達式:

\s(?:(?<subdomain>[a-z0-9\-]*){0,1}\.){0,3}(?<domain>(?>([a-z0-9\-]+)))\.(?<tld>[a-z\.]{2,6})\s 

數據集:

apple.orange.banana.clevername.co.uk 
strawberry.apple.orange.banana.clevername.co.uk 
tangerine.com.au 
simple.com 

注:有之前和之後的域空間,他們將永遠是小寫。

的如何這個數據將匹配的一個例子:

apple.orange.banana.clevername.co.uk

子域:apple.orange.banana
域:谷歌
tld:co.uk

如果我將另一個水果添加到子域(strawberry.apple.orange.banana.clevern ame.co.uk),比賽將失敗。如果我將子域正則表達式的{0,3}修改爲更高的數字或無限數量的匹配,它會變得過於貪婪,並且不再以domain/tld的正確匹配結束。的這個實施例:

改性的正則表達式:

\s(?:(?<subdomain>[a-z0-9\-]*){0,1}\.){0,5}(?<domain>(?>([a-z0-9\-]+)))\.(?<tld>[a-z\.]{2,6})\s 

匹配結果與新的正則表達式:

strawberry.apple.orange.banana.clevername.co.uk

子域名:strawberry.apple.orange.banana.clevername
域名:
TLD:co.uk

我敢肯定,正則表達式是不是最有效的兩種所以任何幫助或建議,將不勝感激。謝謝!

回答

0

我相信這應該爲你做:

\s((?<subdomain>[a-z0-9\.\-]*)\.)?(?<domain>[a-z0-9\-]{3,}(?=\.[a-z\.]{3,6}))\.(?<tld>[a-z\.]{3,6})\s

在Splunk的測試這一點,它與你的測試數據集的作品。

請注意,這不適用於像bit.ly這樣的非常短的域名,因爲如果不查詢TLD,就無法從子域中告訴域名。

例如,比較something.bit.lyclevername.com.au。沒有外部信息,沒有辦法說明bitclevername是域名。

0

我最近遇到了同樣的問題。所以我採取了Syon的正則表達式並對其進行了修改。這是結果:

\s(?:(?<subdomain>[a-z0-9\.\-]*)\.)?(?<domain>(?!com)[a-z0-9\-]{3,}(?=\.[a-z\.]{2,}))\.(?:(?<tld>[a-z\.]{2,})$)\s

它適用於整個測試數據集(我修剪的空間雖然),以及像bit.ly短域名。也適用於新的頂級域名,如.cancerresearch。見結果: https://regex101.com/r/nX6yQ7/4

注:正則表達式的具體規定,domain不能com,這需要更新,如果其他{3 characters}.xyztlds需要支持