2013-04-17 88 views
0

我是一個新的開發人員,在正則表達式上沒有太多的曝光。今天,我分配使用正則表達式修復一個錯誤,但經過很多努力,我無法找到錯誤。正則表達式來驗證域名的端口

這是我的要求。

我的代碼是:

string regex = "^([A-Za-z0-9\\-]+|[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9] {1,3}\\.[A-Za-z0-9]{1,3}):([0-9]{1,5}|\\*)$"; 

Regex _hostEndPointRegex = new Regex(regex); 

bool isTrue = _hostEndPointRegex.IsMatch(textBox1.Text); 

它拋出一個錯誤的域名,如 「nikhil-dev.in.abc.ni:8080」。

我不確定問題出在哪裏。

+0

建議的正則表達式我覺得你的問題是,'-'一直未獲準......這麼說,我的正則表達式是不是很大。 –

+0

爲什麼重新發明車輪,不好?有一些函數像['Uri.CheckHostName()'](http://msdn.microsoft.com/en-us/library/system.uri.checkhostname.aspx)(假設[here](http:// stackoverflow.com/questions/967516/best-way-to-determine-if-a-domain-name-would-be-a-valid-in-a-hosts-file))和一個可怕的正則表達式[here] (http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address)。 – CodeCaster

回答

2

你的正則表達式有點多餘,因爲你或者某些已經包含在其他或塊中的東西。

我只是簡化你不得不

(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5} 

什麼和它的作品就好了... ...

我不知道爲什麼你允許的字符有\我敢肯定\是不允許在主機名中。

你的問題是,你或|打破東西像這樣...

[A-Za-z0-9\\-]+ 

[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3} 

\* 

其中的評註者說的話,包括 「 - 」 在第2塊。

因此,也許你打算

^((?:[A-Za-z0-9\\-]+|[A-Za-z0-9]{1,3})\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}):([0-9]{1,5}|\*)$ 

但是第一兩個或運算項目將是多餘的,因爲+ {包括1-3}。

即。 [A-Za-z0-9 \ - ] +也會匹配任何匹配的內容[A-Za-z0-9] {1,3}

您可以使用此工具來幫助測試您的Regex: http://regexpal.com/

我個人認爲,每個開發者都應該有regexbuddy

以上,雖然它的工作原理將允許非有效主機名正則表達式。

它應該被修改爲不允許在第一個字符中標點符號。

所以它應該被修改看起來像這樣。

(?:[A-Za-z0-9][A-Za-z0-9-]+\.)(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5} 

同樣在理論上,主機不允許以連字符結尾。

它是如此複雜我會使用正則表達式來捕獲部分,然後使用Uri.CheckHostName來實際檢查Uri是否有效。

或者你也可以使用由CodeCaster

+0

謝謝jsobo,它爲我工作。 – agnikhil82