2012-11-14 126 views
3

我想使用正則表達式從HTML頁面的IP地址:正則表達式IP(V4)地址

<html> 
    <head><title>Current IP Check</title></head> 
    <body>Current IP Address: xx.xxx.xxx.xx</body> 
</html> 

我的VB.Net代碼是目前這樣的:

Using wClient As New WebClient 
    ip = wClient.DownloadString("http://checkip.dyndns.org/") 
    ip = Regex.Match(ip, "^[+-]?(\d+(\.\d+)?|\.\d+)$", RegexOptions.Singleline).ToString 
End Using 

然而,最終的結果對於IP來說沒有任何意義。

我只是希望得到xx.xxx.xxx.xx

我會怎麼被錯誤地做什麼?

+0

您的RegEx假定IP有一條完整的線路,例如代碼,但它沒有。 –

回答

7

IP地址的正則表達式比您所概述的複雜得多。但是沒有理由重新發明輪子。請看看Regular Expression Examples,這裏是佔了一切之一:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 
0

IPv4s沒有+或 - 號,如果你不是在其他類似的字符串模式的危險,你能真正做到這一點更簡單地

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 

此外,如果你需要找到IPv6地址,那麼你可以嘗試像

\b(?:[\dA-F]{1,4}:){1,7}(?:(?::[\dA-F]{1,4}){1,6}|(?:::[\dA-F]{1,4}){1,7}|:|[\dA-F]{1,4})?\b 

注意,這兩個會發現「候選者」,不應該用於驗證。 如果要使用RegEx驗證IPv6,請查看here

0

對於這樣簡單的HTML你可以只使用strings.split:

Dim source As String = wClient.DownloadString("http://checkip.dyndns.org/") 
Dim ip As String = Split(Split(source, "Current IP Address:")(1), "</body>")(0).Trim() 
+0

使用字符串拆分來解析HTML並不是一個好的建議。 – Neolisk

+0

@Neolisk這是一個實用的建議,它基於所討論的html的簡單性,它在三年後依然有效。正則表達式同樣脆弱,加載一個完整的html解析器對於這樣一個微不足道的情況來說是過度的,儘管我同意它是最強大的解決方案 – Steve

0

正如@ Neolisk的回答是在大部分時間工作,我編輯它接受與領先的零號:

\b(0*(25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(0*(25[0-5]|2[0-4]\d|[01]?\d\d?))\b 

接受一些IP,如000010.10.10.000001